我写了一个在线人数统计,如今出现两情状况
状况一:上线时必须手动刷新一次才会进行当前人数统计
状况二:下线时,只有关闭服务器里面的页面才会 -1,关闭IE,火狐,谷歌等浏览器都不会-1;以下是本人代码,请高手指教:web.xml//配置文件  <listener>
   <listener-class>com.fx.Listener.listener</listener-class>
  </listener>
... servlet配置代码省略 ...listener.java//监听器public class listener implements HttpSessionListener {
private static int count;
public void sessionCreated(HttpSessionEvent arg0) {
add();
}
public void sessionDestroyed(HttpSessionEvent arg0) {
del();
}
public static void add(){
++ count; }
public static void del(){
-- count; 
}
public static int getCount(){
return count;
}
}servlet.jsp //打开页面时调用的servlet----->doPost方法体 int count = listener.getCount();
req.getSession().setAttribute("num", count);
req.getRequestDispatcher("index.jsp").forward(req, resp);index.jsp//显示页面
<script type="text/javascript">
function window.onunload(){
if((window.screenLeft>=10000&&window.screenTop>=10000)||event.altKey){
form1.action="servlet2";
form1.submit();
}
}
</script>
    <form name="form1">
    当前在线人数为:${num }
  </form>servlet2.jsp//关闭页面时调用的servlet----->doPost方法体 req.getSession().invalidate();

解决方案 »

  1.   

    第一个问题呢,在调用:
    int count = listener.getCount();
    之前,先去访问下session,确保当前会话已经创建。
    第二个问题呢,你需要脑补下会话的含义及其生命周期是啥。
    关闭页面不代表会话结束(sessionDestroyed),会话结束只有两种情况:
    1、代码中主动调用session.destory(); 这种一般用于 logout 页面;
    2、会话超时,也就是用户在很长一段时间没有再次访问该应用,比如半小时,那么中间件会回收该会话。
      

  2.   

    第二个问题不能用session超时来限制,如果用户不采取任何操作30分钟后都会session失效的。
    我建议还是用javascript监听用户是否关闭浏览器进而用ajax去访问destory()方法
      

  3.   


    第一个肯定是创建了呀,要是没有创建,怎么会刷新后就统计人数呢第二个我在页面写了一个js代码的,如果页面关闭就会去servlet2这个servlet里面,这个里面调用强制销毁session,这样的思路应该是没有错的呀
      

  4.   

    第二个问题不能用session超时来限制,如果用户不采取任何操作30分钟后都会session失效的。
    我建议还是用javascript监听用户是否关闭浏览器进而用ajax去访问destory()方法赞同
      

  5.   

    /* (non-Javadoc)
     * @see javax.servlet.http.HttpSessionListener#sessionCreated(javax.servlet.http.HttpSessionEvent)
     */
    @Override
    public void sessionCreated(HttpSessionEvent httpSessionEvent) {
    onlineUserCount ++;
    toUpdateCount(httpSessionEvent);
    } /* (non-Javadoc)
     * @see javax.servlet.http.HttpSessionListener#sessionDestroyed(javax.servlet.http.HttpSessionEvent)
     */
    @Override
    public void sessionDestroyed(HttpSessionEvent httpSessionEvent) {
    onlineUserCount --;
    toUpdateCount(httpSessionEvent);
    } private void toUpdateCount(HttpSessionEvent httpSessionEvent){
    httpSessionEvent.getSession().setAttribute("onlineUserCount", onlineUserCount);
    }