-
c语言入门之如何应用Session开发非Web终端
作者: 徐荣胜
Session(会话)是Web上较为有效的信息交互手段。因其使用方便、稳定、安全可靠而被众多Web开发者所青睐。尤其在互联网身份认证、网上电子购物等方面的应用更为广泛。无独有偶,笔者在开发一个财政项目的数据中心平台时,觉得数据传送部分的身份认证和信息交互与Web领域的Session控制极其相似。于是就想尝试一下这新技术,通过查阅大量资料后觉得在非Web客户端用Session进行信息交互也切实可行。经过反复测试成功后应用于项目中,成效显著,省去了较多的临时数据保存以及繁锁的状态检测,由Session自动维持状态。
好东西不能独享,笔者想把这次成功应用Session控制进行非Web开发的关键技术点讲述一下,来共同探讨。我们知道Cookie是Web上最常用的跟踪用户会话方式,当Cookie被禁止后,一般都用URL重写来跟踪会话。那么Cookie到底是什么东西呢?按照定义:Cookie是一种由服务器发送给客户的片段信息,存储在客户环境中,并且在客户所有的对服务器的请求中都要发回它。举个例子说,当我们用IE登录某个电子购物商城时,IE在得到商品列表页面的同时还收到Set-Cookie应答头信息。这个信息的格式为“Set-Cookie:NAME=VALUE;Comment=COMMENT;Domain=DOMAINNMAE;Max-age=SECONDS;Path=PATH;secure;Version=1*DIGIT”,其中NAME值对(值对间用分号分隔)是必须的,其余都是可选的。最重要的信息当然也在所必须的值对里了,VALUE是NAME的值,也是这个Cookie的标识,Max-age定义了Cookie的最长生存时间,其它几个可选值对可参阅http://www.faqs.org/rfcs/rfc2109.html。当我们选购了某种商品,向服务器发送选购清单时,会自动在你的请求信息头里加上NAME值对,如果Cookie被禁止,则用URL重写方式在URL请求地址上附加NAME值对。当Web服务器收到这个请求后,会检查该Cookie是否存在,然后相应的跟踪会话。从以上分析不难理解,其实Web服务器跟踪会话就靠Set-Cookie头信息,跟踪NAME值对进行身份验证。假如我们用非Web终端接收Web服务器的响应信息,从中解析出Cookie头信息,当再次向Web服务器发送请求时附加上解析出的Cookie信息,Web服务器据此不就可以进行身份认证了吗?
有了上面的分析,我们写出代码也非常方便了。下面是笔者用C++Builder 6应用程序与Apache Tomcat 4.0服务引擎中的Servlet交互的演示代码,仅作参考。
C++客户端在初次向服务器发请求时的代码如下:
TIdHTTP *HTTPClient = new TIdHTTP(NULL);
TIdHeaderList * hList;
String URL= "http://localhost:8080/Rev/servlet/test";
try
{
try
{
HTTPClient->Get(URL);
if (HTTPClient->Response != NULL)
{
hList = HTTPClient->Response->ExtraHeaders;
String cookie = hList->Values["Set-Cookie"];
int pos = cookie.Pos(";");
if (pos > 0)
Session_ID = cookie.SubString(1,pos-1);
else
Session_ID = cookie;
}
} catch(Exception& E)
{
}
} __finally
{
HTTPClient->Free();
}
上面代码中变量URL指向所在Servlet的HTTP地址,根据各自情况赋值;变量Session_ID为全局变量,记录Cookie。下次交互时只需在HTTPClient请求前加上“HTTPClient->Request->ExtraHeaders->Add("Cookie:" + Session_ID);”,Apache Tomcat就会自动判别有效性了。简单吗?
Servlet服务端的有效性验证也比较容易,具体的Cookie认证过程就让Apach Tomcat引擎去做了,如下所示:
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html; charset=GBK");
PrintWriter out = response.getWriter();
out.println("<html>");
out.println("<head><title>身份认证</title></head>");
out.println("<body>");
HttpSession session = request.getSession(false);
if (session != null) {
out.println("<p>身份确认</p>");
} else {
out.println("<p>认证失败</p>");
}
out.println("</body></html>");
}
代码中最关键的是“request.getSession(false);”,参数为true时Apache Tomcat建立一个新的Session;参数为false时Apache Tomcat会根据request中的信息寻找相关联的Session。所以想要维持Session的持续性,必须用参数false调用,但如果长时间没调用该Session,Apache Tomcat为合理利用资源会自动使该Session无效,有关Apache Tomcat的管理机制及其配置可参考http://jakarta.apache.org/。
演示代码中用了C++Builder自带的TIdHTTP组件,该组件严格按照HTTP规范实现,Delphi中也有该组件,Visual C++也有类似的MFC,可根据各自熟悉的开发平台调试,调试时必须把用于认证的Servlet程序加载到Apach Tomcat上,并重新启动Apach Tomcat。以上代码只供演示而已,要实际应用还需增加各种异常处理和HTTPClient的Request请求包以及Servlet的Response响应包的处理,有兴趣的朋友可通过Email:21cnDeveloper@163.com与笔者进一步交流。
Session(会话)是Web上较为有效的信息交互手段。因其使用方便、稳定、安全可靠而被众多Web开发者所青睐。尤其在互联网身份认证、网上电子购物等方面的应用更为广泛。无独有偶,笔者在开发一个财政项目的数据中心平台时,觉得数据传送部分的身份认证和信息交互与Web领域的Session控制极其相似。于是就想尝试一下这新技术,通过查阅大量资料后觉得在非Web客户端用Session进行信息交互也切实可行。经过反复测试成功后应用于项目中,成效显著,省去了较多的临时数据保存以及繁锁的状态检测,由Session自动维持状态。
好东西不能独享,笔者想把这次成功应用Session控制进行非Web开发的关键技术点讲述一下,来共同探讨。我们知道Cookie是Web上最常用的跟踪用户会话方式,当Cookie被禁止后,一般都用URL重写来跟踪会话。那么Cookie到底是什么东西呢?按照定义:Cookie是一种由服务器发送给客户的片段信息,存储在客户环境中,并且在客户所有的对服务器的请求中都要发回它。举个例子说,当我们用IE登录某个电子购物商城时,IE在得到商品列表页面的同时还收到Set-Cookie应答头信息。这个信息的格式为“Set-Cookie:NAME=VALUE;Comment=COMMENT;Domain=DOMAINNMAE;Max-age=SECONDS;Path=PATH;secure;Version=1*DIGIT”,其中NAME值对(值对间用分号分隔)是必须的,其余都是可选的。最重要的信息当然也在所必须的值对里了,VALUE是NAME的值,也是这个Cookie的标识,Max-age定义了Cookie的最长生存时间,其它几个可选值对可参阅http://www.faqs.org/rfcs/rfc2109.html。当我们选购了某种商品,向服务器发送选购清单时,会自动在你的请求信息头里加上NAME值对,如果Cookie被禁止,则用URL重写方式在URL请求地址上附加NAME值对。当Web服务器收到这个请求后,会检查该Cookie是否存在,然后相应的跟踪会话。从以上分析不难理解,其实Web服务器跟踪会话就靠Set-Cookie头信息,跟踪NAME值对进行身份验证。假如我们用非Web终端接收Web服务器的响应信息,从中解析出Cookie头信息,当再次向Web服务器发送请求时附加上解析出的Cookie信息,Web服务器据此不就可以进行身份认证了吗?
有了上面的分析,我们写出代码也非常方便了。下面是笔者用C++Builder 6应用程序与Apache Tomcat 4.0服务引擎中的Servlet交互的演示代码,仅作参考。
C++客户端在初次向服务器发请求时的代码如下:
TIdHTTP *HTTPClient = new TIdHTTP(NULL);
TIdHeaderList * hList;
String URL= "http://localhost:8080/Rev/servlet/test";
try
{
try
{
HTTPClient->Get(URL);
if (HTTPClient->Response != NULL)
{
hList = HTTPClient->Response->ExtraHeaders;
String cookie = hList->Values["Set-Cookie"];
int pos = cookie.Pos(";");
if (pos > 0)
Session_ID = cookie.SubString(1,pos-1);
else
Session_ID = cookie;
}
} catch(Exception& E)
{
}
} __finally
{
HTTPClient->Free();
}
上面代码中变量URL指向所在Servlet的HTTP地址,根据各自情况赋值;变量Session_ID为全局变量,记录Cookie。下次交互时只需在HTTPClient请求前加上“HTTPClient->Request->ExtraHeaders->Add("Cookie:" + Session_ID);”,Apache Tomcat就会自动判别有效性了。简单吗?
Servlet服务端的有效性验证也比较容易,具体的Cookie认证过程就让Apach Tomcat引擎去做了,如下所示:
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html; charset=GBK");
PrintWriter out = response.getWriter();
out.println("<html>");
out.println("<head><title>身份认证</title></head>");
out.println("<body>");
HttpSession session = request.getSession(false);
if (session != null) {
out.println("<p>身份确认</p>");
} else {
out.println("<p>认证失败</p>");
}
out.println("</body></html>");
}
代码中最关键的是“request.getSession(false);”,参数为true时Apache Tomcat建立一个新的Session;参数为false时Apache Tomcat会根据request中的信息寻找相关联的Session。所以想要维持Session的持续性,必须用参数false调用,但如果长时间没调用该Session,Apache Tomcat为合理利用资源会自动使该Session无效,有关Apache Tomcat的管理机制及其配置可参考http://jakarta.apache.org/。
演示代码中用了C++Builder自带的TIdHTTP组件,该组件严格按照HTTP规范实现,Delphi中也有该组件,Visual C++也有类似的MFC,可根据各自熟悉的开发平台调试,调试时必须把用于认证的Servlet程序加载到Apach Tomcat上,并重新启动Apach Tomcat。以上代码只供演示而已,要实际应用还需增加各种异常处理和HTTPClient的Request请求包以及Servlet的Response响应包的处理,有兴趣的朋友可通过Email:21cnDeveloper@163.com与笔者进一步交流。
最新更新
Objective-C语法之代码块(block)的使用
VB.NET eBook
Add-in and Automation Development In VB.NET 2003 (F
Add-in and Automation Development In VB.NET 2003 (8
Add-in and Automation Development in VB.NET 2003 (6
Add-in and Automation Development In VB.NET 2003 (5
AddIn Automation Development In VB.NET 2003 (4)
AddIn And Automation Development In VB.NET 2003 (2)
Addin and Automation Development In VB.NET 2003 (3)
AddIn And Automation Development In VB.NET 2003 (1)
2个场景实例讲解GaussDB(DWS)基表统计信息估
常用的 SQL Server 关键字及其含义
动手分析SQL Server中的事务中使用的锁
openGauss内核分析:SQL by pass & 经典执行
一招教你如何高效批量导入与更新数据
天天写SQL,这些神奇的特性你知道吗?
openGauss内核分析:执行计划生成
[IM002]Navicat ODBC驱动器管理器 未发现数据
初入Sql Server 之 存储过程的简单使用
SQL Server -- 解决存储过程传入参数作为s
武装你的WEBAPI-OData入门
武装你的WEBAPI-OData便捷查询
武装你的WEBAPI-OData分页查询
武装你的WEBAPI-OData资源更新Delta
5. 武装你的WEBAPI-OData使用Endpoint 05-09
武装你的WEBAPI-OData之API版本管理
武装你的WEBAPI-OData常见问题
武装你的WEBAPI-OData聚合查询
OData WebAPI实践-OData与EDM
OData WebAPI实践-Non-EDM模式