zoukankan      html  css  js  c++  java
  • J2EE中关于session 的生命周期

    转自:http://blog.sina.com.cn/s/blog_89511a1701012c5e.html

    在谈论session机制的时候,常常听到这样一种误解“只要关闭浏览器,session就消失了”。其 实可以想象一下会员卡的例子,除非顾客主动对店家提出销卡,否则店家绝对不会轻易删除顾客的资料。对session来说也是一样的,除非程序通知服务器删 除一个session,否则服务器会一直保留,程序一般都是在用户做log off的时候发个指令去删除session。然而浏览器从来不会主动在关闭之前通知服务器它将要关闭,因此服务器根本不会有机会知道浏览器已经关闭,之所 以会有这种错觉,是大部分session机制都使用会话cookie来保存session id,而关闭浏览器后这个session id就消失了,再次连接服务器时也就无法找到原来的session。如果服务器设置的cookie被保存到硬盘上,或者使用某种手段改写浏览器发出的 HTTP请求头,把原来的session id发送给服务器,则再次打开浏览器仍然能够找到原来的session。 .

    恰恰是由于关闭浏览器不会导致session被删除,迫使服务器为seesion设置了一个失效时间,当距离客户端上一次使用session的时间超过这个失效时间时,服务器就可以认为客户端已经停止了活动,才会把session删除以节省存储空间。!

    session机制是一种服务器端的机制,服务器使用一种类似于散列表的结构(也可能就是使用散列表)来保存信息。  
       
      当程序需要为某个客户端的请求创建一个session的时候,服务器首先检查这个客户端的请求里是否已包含了一个session标识   -   称为session   id,如果已包含一个session   id则说明以前已经为此客户端创建过session,服务器就按照session   id把这个session检索出来使用(如果检索不到,可能会新建一个),如果客户端请求不包含session   id,则为此客户端创建一个session并且生成一个与此session相关联的session  id,session   id的值应该是一个既不会重复,又不容易被找到规律以仿造的字符串,这个session   id将被在本次响应中返回给客户端保存。  
       
      1、session在何时被创建  
      一个常见的误解是以为session在有客户端访问时就被创建,然而事实是直到某server端程序调用 HttpServletRequest.getSession(true)这样的语句时才被创建,注意如果JSP没有显示的使用   <%@page  session="false"%>   关闭session,则JSP文件在编译成Servlet时将会自动加上这样一条语句HttpSession  session   =   HttpServletRequest.getSession(true);这也是JSP中隐含的session对象的来历。  
       
      由于session会消耗内存资源,因此,如果不打算使用session,应该在所有的JSP中关闭它。  
       
      2、session何时被删除  
      综合前面的讨论,session在下列情况下被删除a.程序调用HttpSession.invalidate();或b.距离上一次收到客户端发送的 session   id时间间隔超过了session的超时设置;或c.服务器进程被停止(非持久session)  
       
      3、如何做到在浏览器关闭时删除session  
      严格的讲,做不到这一点。可以做一点努力的办法是在所有的客户端页面里使用javascript代码window.oncolose来监视浏览器的关闭动 作,然后向服务器发送一个请求来删除session。但是对于浏览器崩溃或者强行杀死进程这些非常规手段仍然无能为力。  
       
      4、有个HttpSessionListener是怎么回事  
      你可以创建这样的listener去监控session的创建和销毁事件,使得在发生这样的事件时你可以做一些相应的工作。注意是session的创建和 销毁动作触发listener,而不是相反。类似的与HttpSession有关的listener还有 HttpSessionBindingListener,HttpSessionActivationListener和 HttpSessionAttributeListener。

    在项目中 在web.xml中配置

    <session-config>
    <session-timeout>30</session-timeout>
    </session-config>,默认session在服务器端保持30分钟

    在浏览器的cookie里面保存有JSESSIONID,当HttpServletRequest.getSession(true)执行此语句时

    服务器会检查客户端请求里面有无JSESSIONID,如果有了就会返回该JSESSIONID对应的session,

    如果没有会创建一个新的session。

  • 相关阅读:
    qt做触摸屏演示程序
    sis9280触摸ic 基于rk3288 的安卓4.4的 多点触摸
    自己动手做logo
    把代码做成库文件,防止修改或者查看。
    闲事无聊恳这个
    Python特殊序列d能匹配哪些数字?
    Python正则表达式re.search(r'*{3,8}','*****')和re.search('*{3,8}','*****')的匹配结果为什么相同?
    Python正则表达式re.match(r"(..)+", "a1b2c3")匹配结果为什么是”c3”?
    Python匹配对象的groups、groupdict和group之间的关系
    Python正则表达式处理中的匹配对象是什么?
  • 原文地址:https://www.cnblogs.com/javahuang/p/2846846.html
Copyright © 2011-2022 走看看