Session的生命同期

一、什么是Session,怎么用

  Session是存放用户与web服务器之间的会话,即服务器为浏览器开辟的存储空间。

  由于浏览器与服务器之间的会话是无状态(无状态的意思是会话之间无关联性,无法识别该用户曾经访问过)的机制,Session则可用于关联访问,因此多用与用户登录等功能上。

  服务器端获取Session中的值方法:

1 //通过request来获取Session对象
2 //通过session对象的setAttribute(k,v)方法将值保存到Session中
3 request.getSession().setAttribute("key","value");
4 
5 //通过session对象的getAttribute(key)来获取Session中的值
6 request.getSession().getAttribute("key");

   Session存在是为了提高安全性,因为Session是存放在服务器上的,与Cookies不同,Cookies存放在客户端浏览器中。因此cookie是较为危险的,若客户端遭遇黑客攻击,信息容易被窃取,数据也可能被篡改,而运用Session可以有效避免这种情况的发生。

二、Session的生命周期

  1.什么时候生效

    当浏览器第一次访问服务器的时候创建    //注:当只有访问动态资源的时候才会创建,如 jsp、Servlet。访问静态资源的时候并不会创建,如 image、html,但是可以通过request.getSession(true)强制创建Session。

  2.什么时候失效

    1)服务器会将长时间不活动的Session强制清除掉,此时就会失效。Tomcat中的Session有效时间默认为30分钟。

    2)通过调用invalidate方法,使服务器端的所有Session全部失效。request.getSession().invalidate();

  3.失效是从什么时候开始的。

    是从Session不活动的时候开始计时,如果达到了失效时间,那么会清掉Session。一旦Session被访问,计时就会清0。

  4.设置Session失效时间

    1.web.xml中设置

1 <session-config>
2     //当timeout设置为-1时,表示永不过期
3     <session-timeout>30</session-timeout>
4 </session-config>

 

    2.在程序中设置

      request.getSession.setMaxInactiveInterval(-1)    //注:-1表示永不过期,值单位为秒30分钟(30*60)

    3.在Tomcat中的Context设置过默认过期时间

 

1 <Context path="/livsorder" docBase="/home/httpd/html/livsorder" defaultSessionTimeOut="3600" isWARExpanded="true" isWARValidated="false" isInvokerEnabled="true"   isWorkDirPersistent="false"/>

 

 

 

三、Session的工作原理

  虽然Session保存在服务器,对客户端是透明的,它的正常运行仍然需要客户端浏览器的支持。这是因为Session需要使用Cookie作为识别标志。HTTP协议是无状态的,Session不能依据HTTP连接来判断是否为同一客户,因此服务器向客户端浏览器发送一个名为JSESSIONID的Cookie,它的值为该Session的id(也就是HttpSession.getId()的返回值)。Session依据该Cookie来识别是否为同一用户。

  该Cookie为服务器自动生成的,它的maxAge属性一般为-1,表示仅当前浏览器内有效,并且各浏览器窗口间不共享,关闭浏览器就会失效。因此同一机器的两个浏览器窗口访问服务器时,会生成两个不同的Session。但是由浏览器窗口内的链接、脚本等打开的新窗口(也就是说不是双击桌面浏览器图标等打开的窗口)除外。这类子窗口会共享父窗口的Cookie,因此会共享一个Session。

  注意:新开的浏览器窗口会生成新的Session,但子窗口除外。子窗口会共用父窗口的Session。例如,在链接上右击,在弹出的快捷菜单中选择”在新窗口中打开”时,子窗口便可以访问父窗口的Session。

  如果客户端浏览器将Cookie功能禁用,或者不支持Cookie怎么办?例如,绝大多数的手机浏览器都不支持Cookie。Java Web提供了另一种解决方案:URL地址重写。

  URL地址重写是对客户端不支持Cookie的解决方案。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了。

 

posted on 2019-03-09 13:29  EmilZs丶  阅读(196)  评论(0编辑  收藏  举报