標籤:bsp 否則 工具類 使用者資訊 util null -- attr http
線上使用者使用HttpSessionListener監聽器統計
每當一個session會話建立 線上使用者人數+1
每當一個session會話銷毀 線上使用者人數-1
使用ServletRequestListener監聽器統計使用者資訊
每當一個request建立 將目前使用者放入集合
每當session會話銷毀 將目前使用者移出集合
我使用的是Servlet3.0 監聽器直接使用註解@webListener即可 不用在web.xml中布局
在web.xml中配置session-timeout標籤 標誌session到期時間為1分鐘 0為不到期
<session-config> <session-timeout>1</session-timeout> </session-config>
servlet3.0使用條件
運行結果:
由於session對話關閉時間並不一定以設定的1分鐘為準 所以 gif映像中最後等待時間較長
User 實體類
package com.scx.entity;/** * 使用者實體類 * */public class User {//目前使用者的session idprivate String sessionId;//目前使用者的ip地址private String ip;//目前使用者第一次訪問的時間private String firstTime;public User() {super();}public String getIp() {return ip;}public void setIp(String ip) {this.ip = ip;}public String getFirstTime() {return firstTime;}public void setFirstTime(String firstTime) {this.firstTime = firstTime;}public String getSessionId() {return sessionId;}public void setSessionId(String sessionId) {this.sessionId = sessionId;}}
HttpSessionListener監聽器
package com.scx.listener;import java.util.ArrayList;import javax.servlet.annotation.WebListener;import javax.servlet.http.HttpSessionEvent;import javax.servlet.http.HttpSessionListener;import com.scx.entity.User;import com.scx.util.SessionUtil;/** * HttpSessionListener 監聽器 * */@WebListenerpublic class MyHttpSessionListener implements HttpSessionListener{//目前使用者數private int userCounts=0;@Overridepublic void sessionCreated(HttpSessionEvent se) {//sessionCreated 使用者數+1userCounts++;//重新在servletContext中儲存userCountsse.getSession().getServletContext().setAttribute("userCounts", userCounts);}@Overridepublic void sessionDestroyed(HttpSessionEvent se) {//sessionDestroyed 使用者數-1userCounts--;//重新在servletContext中儲存userCountsse.getSession().getServletContext().setAttribute("userCounts", userCounts);@SuppressWarnings("unchecked")ArrayList<User> userList=(ArrayList<User>) se.getSession().getServletContext().getAttribute("userList");String sessionId=se.getSession().getId();//如果目前使用者在userList中 在session銷毀時 將目前使用者移出userListif(SessionUtil.getUserBySessionId(userList, sessionId)!=null){userList.remove(SessionUtil.getUserBySessionId(userList, sessionId));}//將userList集合 重新儲存到servletContextse.getSession().getServletContext().setAttribute("userList", userList);}}
ServletRequestListener監聽器
package com.scx.listener;import java.text.SimpleDateFormat;import java.util.ArrayList;import java.util.Date;import javax.servlet.ServletRequestEvent;import javax.servlet.ServletRequestListener;import javax.servlet.annotation.WebListener;import javax.servlet.http.HttpServletRequest;import com.scx.entity.User;import com.scx.util.SessionUtil;/** * ServletRequestListener 監聽器 * */@WebListenerpublic class MyServletRequestListener implements ServletRequestListener {//使用者集合private ArrayList<User> userList;@Overridepublic void requestDestroyed(ServletRequestEvent arg0) {}@SuppressWarnings("unchecked")@Overridepublic void requestInitialized(ServletRequestEvent arg0) {//從servletContext中獲的userListuserList=(ArrayList<User>) arg0.getServletContext().getAttribute("userList");//如果servletContext中沒有userList對象 初始化userListif(userList==null){userList=new ArrayList<User>();}HttpServletRequest request=(HttpServletRequest) arg0.getServletRequest();//sessionIdString sessionId=request.getSession().getId();//如果當前sessionId不存在集合中 建立當前user對象if(SessionUtil.getUserBySessionId(userList,sessionId)==null){User user=new User();user.setSessionId(sessionId);user.setIp(request.getRemoteAddr());SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd hh:MM:ss");user.setFirstTime(sdf.format(new Date()));userList.add(user);}//將userList集合 儲存到ServletContextarg0.getServletContext().setAttribute("userList", userList);}}
工具類
package com.scx.util;import java.util.ArrayList;import com.scx.entity.User;public class SessionUtil {//根據sessionId判斷目前使用者是否存在在集合中 如果存在 返回目前使用者 否則返回nullpublic static User getUserBySessionId(ArrayList<User> userList,String sessionId) {for (User user : userList) {if(sessionId.equals(user.getSessionId())){return user;}}return null;}}
java web監聽器統計線上使用者及人數