Session的生命周期(同一浏览器,无论关闭与否,使用同一个session会话,直到session销毁)
Session的生命周期
1.1 session什么时候创建:
Session一般存储在服务器的内存中,Sessinon在用户访问第一次访问服务器时创建(注意只有访问JSP、Servlet等程序时才会创建Session,只访问HTML、IMAGE等静态资源并不会创建Session)。当然,强制生成Session可使用request.getSession(true)方法。
1.2 session什么时候销毁:
1.session的持有者(即客户端浏览器)在最大无活动等待时间(MaxInactiveInterval)内无任何响应或请求 ;
设置方法有许多(这里随便写两种):
1.session.setMaxInactiveInterval(2 * 3600); // Session保存两小时
2.web.xml里有:
<session-config>
<session-timeout>10</session-timeout>
</session-config>
2.调用Session的invalidate方法强制销毁。
3.jsp服务器重起或发生中断(这个和tomcat服务器的配置有关(默认不销毁,可以设置全部销毁),重启默认前会把session写入文件里保存,重启后会读取session文件,所以session默认时间没过还是存在的)
注意:关闭浏览器并不会销毁session,默认下次开启浏览器会新建session,但是旧的session会在最大无活动等待时间后自动执行销毁。(文章后面教如何实现一直使用同一个session)
1.3 Session怎么识别用户(服务器怎么识别/区分用户):
Session需要使用Cookie作为识别标志。HTTP协议是无状态的,Session不能依据HTTP连接来判断是否为同一客户,因此服务器向客户端浏览器发送一个名为JSESSIONID的Cookie,它的值为该Session的id(HttpSession.getId()的返回值)。Session依据该Cookie来识别是否为同一用户。
具体:当你第一次访问一个网站的时候,网站服务器会在响应头内加上Set-Cookie:PHPSESSID=nj1tvkclp3jh83olcn3191sjq3(php服务器),或Set-Cookie JSESSIONID=nj1tvkclp3jh83olcn3191sjq3(java服务器)信息,此信息是服务器随机生成的,放在服务器内存里,为了标识唯一的客户端用户,内容不会重复,这就是sessionid.该Cookie为服务器自动生成的,它的maxAge属性一般为-1,表示仅当前浏览器内有效,并且各浏览器窗口间不共享,关闭浏览器就会失效。因此同一机器的两个浏览器窗口访问服务器时,会生成两个不同的Session。但是由浏览器窗口内的链接、脚本等打开的新窗口(也就是说不是双击桌面浏览器图标等打开的窗口)除外。这类子窗口会共享父窗口的Cookie,因此会共享一个Session。
怎么实现关闭浏览器,再打开浏览器时候使用原来的session:
或者关闭浏览器,再打开浏览器还是登陆的状态:
或者重新打开浏览器没有新建session:
或者使用Cookie实现短时间内不用重新登陆(当然后台也没有自动登陆,和自动登陆有区别):
方法:因为保存Sessionid的cookie是临时的(浏览器关闭就会销毁),所以我们自己手动创建一个持久化的cookie,用来保存sessionid;
//一下是持久化cookie,保存sessionid,实现关闭浏览器,重新打开还是使用原来的session session.setMaxInactiveInterval(2 * 3600); // Session保存两小时 Cookie cookie = new Cookie("JSESSIONID", session.getId()); cookie.setMaxAge(2 * 3600); // 客户端的JSESSIONID也保存两小时 cookie.setPath("/"); response.addCookie(cookie);
(注意,第一次访问时候遍历cookie只有一个cookie,刷新第二次访问遍历却有两个cookie,我想:第一次访问自动生成的临时cookie还没有返回给浏览器,第一次访问结束了,浏览器才有了
临时的cookie,和我们手动持久化的cookie,所以第二次访问遍历获取了两个cookie,都有相同的sessionid属性。关闭浏览器,再访问,遍历只有一个cookie,因为临时的cookie关闭浏览器时候销毁了,
现在只使用持久化的cookie了,里面有sessionid属性)
1.4 如果Cookie功能警用,我们怎么识别用户?
Java Web提供了另一种解决方案:URL地址重写。
URL地址重写的原理是将该用户Session的id信息重写到URL地址中。服务器能够解析重写后的URL获取Session的id。这样即使客户端不支持Cookie,也可以使用Session来记录用户状态。HttpServletResponse类提供了encodeURL(String url)实现URL地址重写,该方法会自动判断客户端是否支持Cookie。如果客户端支持Cookie,会将URL原封不动地输出来。如果客户端不支持Cookie,则会将用户Session的id重写到URL中。
注意:TOMCAT判断客户端浏览器是否支持Cookie的依据是请求中是否含有Cookie。尽管客户端可能会支持Cookie,但是由于第一次请求时不会携带任何Cookie(因为并无任何Cookie可以携带),URL地址重写后的地址中仍然会带有jsessionid。当第二次访问时服务器已经在浏览器中写入Cookie了,因此URL地址重写后的地址中就不会带有jsessionid了。