zoukankan      html  css  js  c++  java
  • Session过期、失效时间

      1.session其实就是一个Map,key=value,通过session.getAttribute("name");获得session中设置的参数

      2.session的过期时间是从什么时候开始计算的?是从一登录就开始计算还是说从停止活动开始计算?

      从session不活动的时候开始计算,如果session一直活动,session就总不会过期。从该Session未被访问,开始计时; 一旦Session被访问,计时清0;

      3.设置session的失效时间

      a)web.xml中

        <session-config> <session-timeout>30</session-timeout> </session-config>

      b)在程序中手动设置

        session.setMaxInactiveInterval(30 * 60);//设置单位为秒,设置为-1永不过期

      c)tomcat也可以修改session过期时间,在server.xml中定义context时采用如下定义:

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

      4.如何判断session过没过期

      1.一个是根据 if(session.getAttribute('user')==null)判断是否为空

      2.另一个判断session不为空的方法:

      request.getSeesion(boolean)方法,这个方法里面传了一个boolean值,
      这个值如果是true,那么如果当前的request的session不可用,那么就创建新的会话,如果存在就返回当前的会话。
      如果参数是false,那么在request的当前会话不存在的时候就返回null。
      这样我们就可以很容易的联想到这个所谓的request的当前会话是否存在和session过期的联系,所以我们就可以“近似地”认为session不存在就是session过期了,那么我们就可以很
      容易地判断session是否过期了。方法如下:

      if(request.getSession(false)==null)
        System.out.println("Session has been invalidated!");
      else
        System.out.println("Session is active!");

      上面有一个“近似地”字眼,也就是说存在特别情况。这个特殊情况就是第一次请求还没有创建会话的时候,那么用这个方法返回的仍然是null,原因我想大家应该是显然的。

      也有很多人觉得应该使用javax.servlet.http.HttpSessionBindingListener接口来实现类似功能。
      他们的意思是当session创建的时候session.setAttribute("isActive","yes");只要session没有过期,那么我们就可以session.getAttribute("isActive")==null来判断,但是我们如果在过
      期以后就不能用这个办法了,因为我们使用过期的session.getAttribute()方法就会抛出java.lang.IllegalStateException,这时候我们就只能通过捕捉这个异常来进行判断,这就会打
      乱我们整个程序的逻辑流程。
      当然我们也可以在session过期的时候这样处理,在HttpSessionBindingListener接口的onValueUnbound()方法里面通过设置一个flag来标志session已过期,之后盘都都使用这个flag,
      那么这个flag一定是要放在application里面,application是HttpServletContex类的对象,所以我们必须对这个flag加入是哪个session过期的信息,这样一来整个的过程就十分麻烦。
      关于用监听器实现我要补充一点,我的方法是站在某一个session的角度来实现的。如果说要监测多个session就应该站在application的角度来分析,这时候的最佳选择
      就是HttpSessionBindingListener或者HttpSessionListener

  • 相关阅读:
    我们为何要使用多线程,它有什么优点?
    Java并发和多线程那些事儿
    【BJG吐槽汇】第2期
    【BJG吐槽汇】第一期
    360:且用且珍惜!解决虚拟机linux启动缓慢以及ssh端卡顿的问题!
    多个不同的app应用间应该如何进行消息推送呢?
    JSONResult 封装
    MySQL 优化集锦
    学习bootstrap3
    开发一个响应式的静态网站---实战
  • 原文地址:https://www.cnblogs.com/chinaifae/p/10401577.html
Copyright © 2011-2022 走看看