public class MySessionListener implements HttpSessionListener{
private static Map usersMap = new HashMap(); public void sessionCreated(HttpSessionEvent se){
HttpSession session = se.getSession();
System.out.println("Session Created.");
} public void sessionDestroyed(HttpSessionEvent se){
HttpSession session = se.getSession();
System.out.println("Session Destroyed.");
}
...
}
在web.xml中配置了该Listener,然后打开一个IE窗口,请求该应用中的页面,控制台打印出Session Created.
再打开一个IE窗口,请求该应用中的页面,控制台又打印出一行Session Created.
现在有两个IE窗口,问题是,但我关闭窗口的时候,控制台不打印Session Destroyed.要等到30分钟后,Session失效后才打印出来。请问怎样才能实现,当用户关闭IE窗口时,立即使Session失效,打印出Session Destroyed.

解决方案 »

  1.   

    Session的创建是因为有request,
    但是销毁却只有以下方法:
    1.等待Session过期
    2.显示调用session.invalidate
    你关闭窗口时根本没触发这两者中的一个,
    Session怎么可能有销毁的事件发生呢。你可以在窗口的onclose事件中向服务器提交一次,
    然后在服务器端显示将session失效。但是如果你通过任务管理器,或其它强制方法(如关机)将浏览器关闭,
    那这个方法就不起做用了。不过还有其它的办法解决。
    可以通过写javascript或applet,与服务器通信,每隔几秒提交一个请求,
    告诉服务器当前session是激活的,并在服务器端开一个线程判断,
    如果有哪个session过了挺长时间(自己定)还没有刷新,那就将它失效。
    就类似于操作系统中的页换出内存。
      

  2.   

    楼主不用想了。你这个测试我也做过,目前是没有解决办法的。唯一好点的就是关闭页面的时候去调用一个销毁session的页面。
      

  3.   

    关闭session的代码执行时间是不确定的。没有办法!!!