解决j2ee会话在浏览器关闭后失效问题

  

前几天在做一个签到系统时,遇到了喜闻乐见的会话问题,项目为弹簧+ SpringMVC + Mybatis框架,maven管理目录的javaweb端系统,对于会话的一些问题,作出以下分析,在这里,着重讨论会话生命周期的问题,至于其他定义,不做解释:

  

<强>首先,说明一下会话的生命周期:

  

存储:会话存储在服务器端,一般为了防止在服务器的内存中(为了高速存取),Sessinon在用户访问第一次访问服务器时创建,需要注意只有访问JSP、Servlet等程序时才会创建会话,只访问HTML、形象等静态资源并不会创建会议。在一个javaweb应用中,可调用<强>请求。getSession(布尔xxx) 生成会话。注意,布尔型参数为真时,在此处强制生成一个新会话的。

  

<强> 1.会话失效时间:

  

距离上一次使用该会话的时间达到设置的失效时间,会话失效
  

  

<强> 2。还有一种是方法session.invalidate()被执行,主动使得会话失效
  

  

对于失效时间,可以通过配置网络。xml中的属性来定义:
  

        & lt; session-config>   & lt; session-timeout>失效时间& lt;/session-timeout>   & lt;/session-config>      

失效时间单位为分钟,若要使会话有效时间为一天,则可以设为60 * 24,当设置为0或负数时,会话永久有效,根据失效时间的定义,很容易理解这一情况。

  

会话为什么在浏览器关闭之后失效了?

  
      <李>未设置会话失效时间,默认为浏览器关闭后失效;李   <李>大部分的会话机制都是采用进程中的饼干来保存sessionid的,也就是JSESSIONID,浏览器关闭后进程消失,进程中的饼干消失,那么sessionid也就跟着消失了。   
  

根据已知的内容,写了一个简单的例子:

        @ controller   公开课SessionTest {   @RequestMapping ("/sessionTest”)   公共字符串sessionTest (HttpServletRequest请求,HttpServletResponse响应){   System.out.println(“成功!”);   HttpSession会话=request.getSession ();   session.setMaxInactiveInterval (259200);   request.setAttribute (“creationtime session.getCreationTime());//创建时间   request.setAttribute (“id”, session.getId ());//id   request.setAttribute (“max”, session.getMaxInactiveInterval(1));//最大失效时间//在这里,MaxInactiveInterval的优先级高于web . xml中的session-cofig,单位为秒   request.setAttribute (“lasttime session.getLastAccessedTime());//上次使用时间   request.setAttribute (“sessionTest”、会话);//System.out.println (session.getCreationTime ());//System.out.println (session.getMaxInactiveInterval ());//System.out.println (session.getLastAccessedTime ());   返回“页面/showSession”;   }   & lt;表边界=?”单元格间距=" 0 "单元格边距=" 0 "比;   & lt; tr> & lt; td>创建时间:& lt;/td> & lt; td> $ {creationtime} & lt;/td> & lt;/tr>   & lt; tr> & lt; td> id: & lt;/td> & lt; td> $ {id} & lt;/td> & lt;/tr>   & lt; tr> & lt; td>最大存活时间:& lt;/td> & lt; td> ${马克斯}& lt;/td> & lt;/tr>   & lt; tr> & lt; td>上次使用时间:& lt;/td> & lt; td> $ {lasttime} & lt;/td> & lt;/tr>   & lt; tr> & lt; td>会话:& lt;/td> & lt; td> $ {sessionTest} & lt;/td> & lt;/tr>   & lt;/table>      

<>强解析:

  
      <李>上面的代码模拟了一次登录情况,控制器中,创建了一个HttpSession对象,基本设置了所有能设置的参数,李   <李>但是在浏览器关闭后,再次进入主页面时,还是需要再次登录,说明浏览器端是没有再次拿到这个会议对象的,我们可以在chrome浏览器的设置→显示高级设置→隐私设置的内容设置→所有饼干与网站数据中,搜索本地tomcat服务器去查看本次存入的会话,即一个名为JSESSIONID的cookie,情况如下
      李   
  

解决j2ee会话在浏览器关闭后失效问题“> <br/>
  <img src=

  

可见,会话的失效时间其实还是在浏览器关闭时,所以只有浏览器不关闭再次访问的情况,才能继续使用登录状态,到底上面我们所设置的失效时间代表的是什么?

  

浏览器和服务器之间创建了一个会议,由于客户端长时间(休眠时间)没有与服务器交互,服务器将此会话销毁,客户端再一次与服务器交互时之前的会话就不存在了,我的理解是,失效时间只生效在一次会话过程中,若浏览器关闭,会话结束,其实失效时间设置为永久有效,就是到浏览器关闭,会话关闭的那个时刻。要解决这个问题,可以把饼干与会话混用,有这么的笨办法:

解决j2ee会话在浏览器关闭后失效问题