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