php 非web应用,如何应用Session开发非Web终端-PHP教程,PHP应用

本文介绍了如何在非Web终端中应用Session进行信息交互,通过解析服务器响应中的Cookie头信息,在后续请求中附带Cookie,实现身份验证。文中以C++Builder6应用程序与Apache Tomcat4.0中的Servlet交互为例,展示了具体实现代码,简化了身份认证和状态管理。
摘要由CSDN通过智能技术生成

如何应用session开发非web终端

协议s

— 作者 sunggsun @ 20:27

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("");

out.println("

身份认证");

out.println("

");

httpsession session = request.getsession(false);

if (session != null) {

out.println("

身份确认

");

} else {

out.println("

认证失败

");

}

out.println("");

}

代码中最关键的是“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与笔者进一步交流。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值