大家都知道session有个超时时间 
我的问题就是这个超时时间在什么时候被刷新 即 客户端向服务器请求期间的什么时间点?
我假想有下面两种可能:
1.是在服务器刚得到请求即立刻根据jsessionid获取到session并刷新超时时间 
2.当在程序中显式的调用getSession后才刷新超时时间如果是2那就好办了.
但如果结果为1.那么 我怎样通过程序指定session不接收此次的超时时间刷新 注:这种情况 监听器似乎是没有作用的.另外我用的是JBOSS 这个应该跟具体实现的服务器有关吧.

解决方案 »

  1.   

    session死亡   发生在以下情况:   
      1.session的持有者(即客户端浏览器)在最大无活动等待时间(MaxInactiveInterval)内无任何响应或请求   
      2.session被调用invalidate()方法强制弊了   
      3.jsp服务器重起或发生中断(此时应该是所有session都当了)   是在服务器刚得到请求即立刻根据jsessionid获取到session并刷新超时时间应该是这种情况
      

  2.   

    我觉得不是这样的,MaxInactiveInterval是最大不活动时间,应该是每接受一次请求就重新起算,直到不活动时间到达销毁session,或超过session的timeout值自动被销毁。
      

  3.   

    楼主可以把MaxInactiveInterval设小一点,把session的timeout值设大一点,试验一下。
      

  4.   

    2.当在程序中显式的调用getSession后才刷新超时时间 
    Web服务器只有在程序显式调用getSession()/getSession(true)时候才会刷新最近访问时间
    如果你在你的jsp中声明了<%@ session="false" %>,而且页面中没有调用getSession方法,那么你的页面无论访问多少次,你最后还是会超时的
      

  5.   

    tong yi lou shang 
      

  6.   

    xiyuan1999 认为是第一种情况
    ChDw 认为是第二种情况
    如果设置<%@ session="false" %> 也不getSession() 那么服务器应该根本就不会建立Session对象吧
    现在关键问题是 已经建立Session了 
    我觉得还是 1的可能性大一点
    现在我的问题还是没有回答啊
    我的问题的主要内容其实是
    在1情况下.
    1.那么 我怎样通过程序指定session不接收此次的超时时间刷新有没有人能指点一下?
      

  7.   

    我又假想 在Session对象中 应该有个属性标式了最大超时时间的值 每次接收到请求 就修改一下最后一次访问时间 以保持session没有超时如果超时则销毁
    现在我就是想在 session判断有没有超时之前 就强行不修改session中的那个最后一次访问时间. 
    servlet api中没有提供这样的接口
    我该怎么办?
      

  8.   

    肯定是第二种情况的,只要你不尝试去getSession()/getSession(true)就肯定不会使得Session的最后访问时间刷新
    只要访问JSP(没有声明session="false")的,则会自动刷新最后访问时间的。如果你想保持会话在IE没有关闭前都生效,只要定时刷新一个简单的JSP页面就可以。
    我不明白你到底要做什么
      

  9.   

    像ls所说那样,你不在jsp里面申明session=false的话,是第二种情况
      

  10.   

    是的 可能我说的不清楚
    如果是getSession()后才会刷新超时时间 那就好办
    我想要做的 就是在客户端发送请求后 不让这次的交互 刷新超时时间.
    说得更详细一点吧。就是用户在线的情况 
    前台通过ajax想后台发送请求 来刷新用户在线的情况 (我试图修改报头 cook jsession=.. 但失败了)
    但是这样会照成用户只要不关浏览器 就永远在线的情况 所以我要让这次的交互不刷新session的超时时间
    事情情况 好像是第一种 用户打开浏览器后只要不关闭浏览器就不会超时
      

  11.   

    但是这样会照成用户只要不关浏览器 就永远在线的情况 怎么会,session time-out时间设置了没,这个应该是从建立session就开始算的。
      

  12.   

    ChDw 我知道你的意思了
    我接受到前台ajax 请求时 自己用servlet直接返回 不走jsp页面 那么也就不用设置session=false 
    之前我都通过jsp页面 容器在构造jsp页面的时候 会自动取出session所以就刷新了
    我的理解是对的吧?
      

  13.   

    如果请求全部走Servlet,那么在你的Servlet中只要不调用 getSession()/getSession(true)就不会刷新时间。
    你可以用getSession(false)来尝试获取Session,如果超时了则返回null,这个方法不会刷新最后访问时间不过你这样容易造成用户经常性会话超时吧,这样的设置好吗?
      

  14.   

    客户的要求就是这样 就像你登陆网上营业厅 一段时间不操作就要超时
    getSession(false);这样即使获取到了Session对象 也不刷新最后访问时间?
      

  15.   

    我刚试了 是不行的 在servlet中 我有一个这个动作getServletContext 不过这个方法中会取session的信息吧。。
      

  16.   

    晕 事实证明getSession之前就刷新了超时时间
      

  17.   

    不需要getSession(0
    你刷新页面,就刷新session
      

  18.   

    我现在的目的是 不刷新session的超时时间
      

  19.   

    MaxInactiveInterval是最大不活动时间,每接受一次请求就重新起算,直到不活动时间到达销毁session,或超过session的timeout值自动被销毁
      

  20.   

    用一个监视器监视session
    在生成的时候启动一个定时器
    定时器到时间清除该session
      

  21.   

    嗯,好像的确是会刷新时间的。无论你是否getSession了,是我错了。你的需求可能得用另外的方法做,你可以在Session中记录上一次有效的访问的访问时间LastValidAccessTime然后配置一个Filter,在请求开始时先校验它是否存在,如果已经存在并且距离现在已经超出指定的时,调用session.invalidate() 另会话失效
      

  22.   


    前台ajax不断地发消息,LastValidAccessTime不受影响吗?
      

  23.   


    既然是这样的,那就是说用LastValidAccessTime也不行。
    请教楼主,最后是怎么做到的?