SpringMVC的線上人數統計監聽器
阿新 • • 發佈:2019-01-30
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); } } }