Session的使用与Session的生命周期

1、HttpSession的方法

  Object getAttribute(String);

  Enumeration<String> getAttributeNames();

  long getCreationTime();

  String getId();

  String getLastAccessedTime();

  Int getMaxInactiveInterval();

  ServletContext getServletContext();

  void invalidate();//销毁当前session

  boolean isNew();

  void removeAttribute();

  void setAttribute(String, object);

  void setMaxInactiveInterval(int);

2、Session生命周期

  Session存储在服务器端,一般放置在服务器的内存中(为了高速存取),Sessinon在用户访问第一次访问服务器时创建,需要注意只有访问JSP、Servlet等程序时才会创建Session,只访问HTML、IMAGE等静态资源并不会创建Session,可调用request.getSession(true)强制生成Session。

  Session什么时候失效?

  1. 服务器会把长时间没有活动的Session从服务器内存中清除,此时Session便失效。Tomcat中Session的默认失效时间为20分钟。

  2. 调用Session的invalidate方法。

  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了。

一般情况下,不管向服务器发送了多少次请求,只有当开始向Session中存储会话状态数据时,Session对象的生命周期才算真正开始,这一点不同于Cache和Application对象(Application对象的生
命周期开始于向网络应用程序发送第一个请求时)。当Session对象为空,Session对象的生命周期还没有开始,Session ID Manager会为每一个请求页面赋予一个新的session ID,且每一次请求都不
相同,直到有数据存储在Session对象中时,就按照图2所示的过程进行会话状态维护。有两个事件与Session对象的生命周期密切相关,分别是Session_OnStart(会话开始)和Session_OnEnd(会话
结束)。如果为Session_OnStart事件定义了处理程序(event handler),那么Session的生命周期从第一次请求该页面就开始,该页面的Session ID一被赋予就不再改变,Session即使为空也会被
存储,因此,从性能的角度考虑,只有在必要时才为Session_OnStart事件定义事件处理程序。Session_OnEnd事件只有在InProc模式下,且Session已经存在的前提下才能被触发,这是因为该事件是
由Cache对象在删除失效的Session对象时触发,可在该事件的处理程序中通过编码终止Session对象。 最后,再补充一点。由上面的讨论可知,Session 对象的实现与Cache对象有着密切联系,尤其是再InProc模式下,但是Session不能提供和Cache那样丰富的缓存过期和依赖机制。在InProc模式下,
Session对象中的数据是否失效,只能通过设定sliding time来控制,即在指定的时间间隔内没用使用Session中的数据,数据自动删除。且考虑Cache自身的特点,Session中的数据也可能在服务
器端内存资源不足的情况下,由于内存回收而丢失。

最新文章

  1. [转载]C#深入分析委托与事件
  2. Java实现约瑟夫环
  3. Jquery-UI使用
  4. laravel强大功能路由初探(二)
  5. js实现下拉菜单
  6. 将博客搬至51CTO
  7. cdh5.4、cm5.4 安装详细步骤
  8. IIS 之 启用日志记录
  9. GSM、GPRS、EDGE、2G、3G与WAP的关系
  10. Ajax发送Post请求
  11. Servlet的学习之Session(1)
  12. 剑指Offer——回溯算法
  13. 被遗弃的depends2.2,替换解决方案——VS命令行
  14. mongDb安装
  15. charles 注册码
  16. 微信公众号本地断点调试(frp反向代理或Remote Debugger)
  17. spring boot 使用application.properties 进行外部配置
  18. 大型系统中使用JMS优化技巧–Sun OpenMQ
  19. 为Web页中的Table对象创建一个映射表
  20. vue组件编写知识点

热门文章

  1. 15 jmeter分布式性能测试
  2. Linux学习网站推荐
  3. 转载一篇debug文章
  4. CentOS6.5安装Redis数据库
  5. MacaW Baby Learns Computer
  6. Asp.net Mvc5的认识
  7. Intro to Python for Data Science Learning 3 - functions
  8. python3 列表的常用方法
  9. python 文件不存在时才能写入,读写模式xt
  10. Python:键盘输入input