JSPSessionTracking



JSPSessionTracking。网络通信分为stateful和stateless两种。http属于stateless。telnet ftp则属于stateful。

session
tracking:就是让web服务器可以追踪用户的状态。
通常有4种方法:
1 使用form的hidden来存储相关的数据
2 使用url重写,让其包含相关的数据参数
3 使用cookie
4
使用servlet的httpsession

服务器来识别请求属于哪个会话,常用的做法是将session
id连同cookie一起传送至客户端,client每次请求时,会将这个识别数据一同发回服务器。

使用hidden的缺点是通过查看html源文件可能会导致数据暴露。
使用url重写的缺点是将数据暴露在浏览器的地址栏中,而且url有长度的限制。

cookie是server利用response的表头传送给用户的信息,然后浏览器使用此信息创建成一个含有key/value对的很小的文本文件,存储在浏览器的暂存区中,当client在请求这个网站时,cookie随着请求一同传到服务器。
使用cookie的问题一个是在于它的有效时间上,另一个是有些人可能因为隐私问题而关闭浏览器的cookie功能,这样就无法进行session
tracking了。

servlet使用的session为javax.servlet.http.HttpSession类的对像。它使用cookie和url重写来实现
session。
当客户端允许cookie的时候,session
id就存储在cookie中进行发送。如果不支持,可以将session id编码到url中进行传送。
使用response.encodeURL(“elftest.jsp”)来成生重写的url
当要进行response.sendRedirect()的时候,它的重写url则使用
response.encodeRedirectURL(“url”)来成生。
如果要使用url重写来保存session
id的话,需要在每个网页都进行url的编码才行,不然无法进行session
tracking。

Session生命周期:
可以使用session的isNew方法来判断session刚被服务器产生,还没有告知client。可以在web.xml中使用如下节点配置
session过期时间
<session-config>
<session-timeout>30</session-timeout>
</session-config>
也可以使用session.setMaxInactiveInterval(seconds)来设置其过期时间。
使用session.invalidate()使session立即失效。

HttpSessionBindingListener接口:
此接口有两个方法valueBound(HttpSessionBindingEvent
arg0)和valueUnbound(HttpSessionBindingEvent
arg0)
当在session中添加实现了HttpSessionBindingListener接口的对像的时候,会自动执行此对像的
valueBound(HttpSessionBindingEvent arg0),而当从session中移除这个对像的时候,会自动执行这个对像的
valueUnbound(HttpSessionBindingEvent arg0)方法。