首页 > 开发 > PHP > 正文

如何应用Session开发非Web终端

2024-05-04 22:53:46
字体:
来源:转载
供稿:网友


如何应用session开发非web终端





协议s

— 作者 sunggsun @ 20:27




session(会话)是web上较为有效的信息交互手段。因其使用方便、稳定、安全可靠而被众多者所青睐。尤其在互联网身份认证、网上电子购物等方面的应用更为广泛。无独有偶,笔者在开发一个财政项目的数据中心平台时,觉得数据传送部分的身份认证和信息交互与web领域的session控制极其相似。于是就想尝试一下这新技术,通过查阅大量资料后觉得在非web客户端用session进行信息交互也切实可行。经过反复测试成功后应用于项目中,成效显著,省去了较多的临时数据保存以及繁锁的状态检测,由session自动维持状态。

好东西不能独享,笔者想把这次成功应用session控制进行非的关键技术点讲述一下,来共同探讨。我们知道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:[email protected]与笔者进一步交流。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表