1. 程式人生 > >SpringMVC的線上人數統計監聽器

SpringMVC的線上人數統計監聽器

package com.shenofusc.utils;
import java.util.ArrayList;
import java.util.HashSet;
import javax.servlet.ServletContext;
import javax.servlet.annotation.WebListener;
import javax.servlet.http.HttpSession;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;
@WebListener
public class SessionListener implements HttpSessionListener {
    public void sessionCreated(HttpSessionEvent event) {
         HttpSession session=event.getSession();
         ServletContext context=session.getServletContext();
        //用set集合來儲存session物件
         HashSet<HttpSession> sessionSet=(HashSet<HttpSession>) context.getAttribute("sessionSet");
         if(sessionSet==null){
             sessionSet=new HashSet<HttpSession>();
             context.setAttribute("sessionSet", sessionSet);
         }
        //這裡主要是為了檢驗使用者是否登入,登入的話強制移除該session,加入新session
         for(HttpSession s : sessionSet){
             if(session.getAttribute("nickname")==s.getAttribute("nickname")){
                 sessionSet.remove(s);
             }
         }
         sessionSet.add(session);
        //儲存線上人數,利用了set集合不重複的特性,避免了重複登入
         context.setAttribute("lineCount", sessionSet.size());
         
    }

    //session的銷燬監聽
  public void sessionDestroyed(HttpSessionEvent event) {
         ServletContext context = event.getSession().getServletContext();
         if (context.getAttribute("lineCount") == null) {
             context.setAttribute("lineCount", 0);
         } else {
             int lineCount = (Integer) context.getAttribute("lineCount");
             if (lineCount < 1) {
                 lineCount = 1;
             }
             context.setAttribute("lineCount", lineCount - 1);
         }
         HttpSession session = event.getSession();
         HashSet<HttpSession> sessionSet = (HashSet<HttpSession>)context.getAttribute("sessionSet");
         if(sessionSet!=null){
             sessionSet.remove(session);
         }
    }
}