日期:2014-05-18  浏览次数:20709 次

HttpSessionListener的问题
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.

------解决方案--------------------
up
------解决方案--------------------
不可以这样的吧

你要把所有叶面都关掉的吧
------解决方案--------------------
关注
------解决方案--------------------
关注

------解决方案--------------------
Session的创建是因为有request,
但是销毁却只有以下方法:
1.等待Session过期
2.显示调用session.invalidate
你关闭窗口时根本没触发这两者中的一个,
Session怎么可能有销毁的事件发生呢。

你可以在窗口的onclose事件中向服务器提交一次,
然后在服务器端显示将session失效。

但是如果你通过任务管理器,或其它强制方法(如关机)将浏览器关闭,
那这个方法就不起做用了。

不过还有其它的办法解决。
可以通过写javascript或applet,与服务器通信,每隔几秒提交一个请求,
告诉服务器当前session是激活的,并在服务器端开一个线程判断,
如果有哪个session过了挺长时间(自己定)还没有刷新,那就将它失效。
就类似于操作系统中的页换出内存。
------解决方案--------------------
up
------解决方案--------------------
楼主不用想了。你这个测试我也做过,目前是没有解决办法的。唯一好点的就是关闭页面的时候去调用一个销毁session的页面。
------解决方案--------------------
关闭session的代码执行时间是不确定的。没有办法!!!