本帖最后由 yl_521 于 2011-06-06 08:05:18 编辑

解决方案 »

  1.   

    楼主在JSP中sleep 2秒,这2秒是请求处理之中,这是个灰色区域:超时从本次请求进入开始计算还是从本次请求退出开始计算。
    楼主可以将这个jsp分解为2个,一个setMaxInactiveInterval并setAttribute,另一个getAttribute,两个jsp间隔1秒以上先后访问,这就没有歧义了。
      

  2.   

    销毁的session,getAttribute报错,这个好理解,就不说了。
    getId为何不报错,是因为session销毁并不意味着session对象被垃圾回收,对象还在,只是状态是销毁状态。而getId方法和是否销毁这个状态无关,它总是可以返回session对象的id
      

  3.   

    第二点我已经得到了验证,将jsp分为两个进行测试,的确在超过有效期后不能取到setAttribute中设置的值。
    但是您将的第一句我不太明白,我的问题是处在对Thread.sleep函数的理解上吧?
      

  4.   

    从第一句代码访问server开始,不就已经开始请求了吗?
      

  5.   

    JSP1.jsp的部分代码:<%=session.getId()%>
    <%
    session.setAttribute("a", "love");
    session.setMaxInactiveInterval(3);
    Thread.sleep(5000);
    %>
    <br>
    <%=session.getAttribute("a")%>
    <br>
    <%=session.getId()%>
    <a href="index2.jsp">页面2</a>JSP2.jsp页面的部分代码<%=session.getAttribute("a")%>
    这段代码执行后,第一个页面是可以正常显示getId()和getAttribute()的值,而第二个页面显示了null
    session的有效期设置为3秒,线程暂停了5秒,最后session还是失效了,是吗?
      

  6.   

    因为Session超期不是简单的事情。其中有的步骤,如做个超期标志,这个好做,(从设置超时时间起算,)到超时时限到达时便直接可以完成。
    但是更多的处理步骤,如清理Session中对象,则有可能需要等到跨线请求退出后才能做,因为涉及到线程同步。更深一步想,这是一种保护措施,防止一个请求处理过程中需要考虑取到的Session竟然已经超期这样的意外。
      

  7.   

    是的,从jsp1到jsp2的跳转(先后两个请求)才显示了Session超期效果。
      

  8.   

    谢谢magong朋友给我的细心、耐心的回复。
    还是有些小问题想明确的确定下:
    1、一个浏览器的请求时从什么时候开始的?是第一句jsp代码吗?
    2、超时到底是从本次请求起始开始计算还是从请求退出开始计算?超时所指的具体范围是什么?
    3、Thread.sleep()方法所休眠的时间到底算不算做"请求"所消耗的时间?
    本人基础很差,见笑了~
      

  9.   

    这里的Thread.sleep()休眠的不是这个页面,解释成的代码是java虚拟机自己写了个空的线程在执行的,不管session的事的!   所以你下面的语句还是可以执行的!
      

  10.   

    1、可以这么说吧。
    2、超时从对Session的上一次访问开始算起。Session是全局性的(跨请求的),超时当然也就是全局性的。
    3、当然算请求处理的时间开销。上面三个概念应该是直白的。
    唯一困难的地方在于session会在一个线程(也就是一个请求处理周期)中被取出并在变量中持有,然后另一个线程(超时控制的)对session做了超时处理,这时有些事情就会因为锁啊同步啊这些问题而变得不好预料了。
    我的做法是尽量避开这些话题(也就是前面所说的灰色区域)
      

  11.   

    对于session的日常应用应该了解的差不多了,就是对于一些像上面这样的特殊情况的具体机制还一知半解,当然“特殊情况”也少见于实际应用之中。
    非常感谢magong的回复~