HttpSession的工做原理及相关常见问题

如下以session简称:
一、session的生命周期:session是在服务器第一次执行getSession()语句时才建立的(此方法:服务器先从浏览器带来的cookie中查找JSESSIONID,是否有相关可用的session,有就调用,若是没有,再从超连接的URL中查找
JSESSIONID,若是尚未,就会建立一个新的session。),若是session对象30分钟内没有被访问,服务器将自动销毁该session.
另外,
能够经过web.xml文件配置session的失效时间,单位为分钟
<seesion-config>
    <session-timeout>10</session-timeout>
</seesion-config>
能够经过session.invalidate()方法来销毁session对象。


二、session的建立是基于cookie的,服务器在新建立session的时候,会自动为session设置一个ID信息,并以cookie的形式回写给浏览器,JSESSIONID=IDNumber,IDNumber是服务器自动生成的惟一的编码;当浏览器访问别的页面的时候,自动会带着该cookie信息,这样服务器会自动调用已生成的session,而不会从新建立session对象,或调用错误的session

三、服务器建立session对象时,生成的cookie是没有指定生存时间的,因此当浏览器意外关闭的时候,相应的cookie会随之销毁,这样用户再次访问相应的页面时,
上次保存的session对象也就找不到了,服务器会再次建立一个新的session对象。这种状况会形成:用户在浏览器意外关闭前,全部保存在session中的操做信息也随之丢失。    
    这样用户体验会至关很差,为了不出现这种状况,咱们须要将保存session对象ID信息的cookie设置一个生存时间,这样浏览器意外关闭的时候,cookie不会随之销毁,这样就保证了,用户在浏览器意外关闭后再次访问页面时,能够继续以前的相应操做。
方法:
一、先获取服务器新建立的session的ID
二、实例化一个与服务器回写给浏览器同样的cookie,以保存此ID信息
三、指定cookie可见的目录,要与服务器默认的相同,默认为相应的web应用

四、设置cookie的生存时间(最好是30分钟之内)
五、将此cookie回写给浏览器
实现代码:
HttpSession session = request.getSession();
String sessionid = session.getId();
Cookie cookie = new Cookie("JSESSIONID", sessionid);
cookie.setPath("/webappName");//这里的path要替换成实际须要用的 
cookie.setMaxAge(30*60);
response.addCookie(cookie);
四、咱们知道了session对象是基于cookie的,若是用户使用的浏览器把cookie禁用了,那么session将会失效。
解决此类问题的方法是:使用URL重写,即将全部涉及到的URL信息中加入session的ID属性JSESSIONID。

实现代码:
String newURL = response.encodeURL("odlURL")
对odlURL进行重写,返回的newURL中包含了session的ID值。

newURL的形式是:
若是odlURL中带有参数,则在?前加上
;JSESSIONID=IDNumber     
格式为:
——;JSESSIONID=IDNumber?——
若是oldURL中没有参数,则直接是oldURL;
JSESSIONID=IDNumber

encodeURL(String url)方法的一个实现细节:该方法执行的时候,服务器会判断浏览器是否带有JSESSIONID相关的cookie,若是有就不会再进行URL重写,若是没有就会进行URL重写。
    咱们知道该方法是为了解决那些禁用或不支持cookie的浏览器出现的相关问题。那么对于支持cookie并且没有禁用cookie的状况下,咱们仍使用URL重写的时候,会出现的状况:第一次访问的时候浏览器是没有带着JSESSIONID的相关cookie的,因此会进行URL重写,在此同时服务器把session的相关cookie信息回写给了浏览器,第二次再访问的时候浏览器带有
JSESSIONID的相关cookie,因此就不会再进行URL重写了。


注:对于那些禁用或不支持cookie的浏览器,经过URL重写后,当浏览器意外关闭面出现的session丢失的问题,是没法解决的!!!

 
对于健壮的会话跟踪,servlet 发出的全部 URL 都应该经过此方法运行。不然,session不能用于不支持 cookie 的浏览器。
相关文章
相关标签/搜索