统计在线人数
Posted For_elegant
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了统计在线人数相关的知识,希望对你有一定的参考价值。
在线用户使用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>
由于session对话关闭时间并不一定以设置的1分钟为准 所以 gif图像中最后等待时间较长
User 实体类
- package com.scx.entity;
- /**
- * 用户实体类
- *
- */
- public class User {
- //当前用户的session id
- private 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 监听器
- *
- */
- @WebListener
- public class MyHttpSessionListener implements HttpSessionListener{
- //当前用户数
- private int userCounts=0;
- @Override
- public void sessionCreated(HttpSessionEvent se) {
- //sessionCreated 用户数+1
- userCounts++;
- //重新在servletContext中保存userCounts
- se.getSession().getServletContext().setAttribute("userCounts", userCounts);
- }
- @Override
- public void sessionDestroyed(HttpSessionEvent se) {
- //sessionDestroyed 用户数-1
- userCounts--;
- //重新在servletContext中保存userCounts
- se.getSession().getServletContext().setAttribute("userCounts", userCounts);
- @SuppressWarnings("unchecked")
- ArrayList<User> userList=(ArrayList<User>) se.getSession().getServletContext().getAttribute("userList");
- String sessionId=se.getSession().getId();
- //如果当前用户在userList中 在session销毁时 将当前用户移出userList
- if(SessionUtil.getUserBySessionId(userList, sessionId)!=null){
- userList.remove(SessionUtil.getUserBySessionId(userList, sessionId));
- }
- //将userList集合 重新保存到servletContext
- se.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 监听器
- *
- */
- @WebListener
- public class MyServletRequestListener implements ServletRequestListener {
- //用户集合
- private ArrayList<User> userList;
- @Override
- public void requestDestroyed(ServletRequestEvent arg0) {
- }
- @SuppressWarnings("unchecked")
- @Override
- public void requestInitialized(ServletRequestEvent arg0) {
- //从servletContext中获的userList
- userList=(ArrayList<User>) arg0.getServletContext().getAttribute("userList");
- //如果servletContext中没有userList对象 初始化userList
- if(userList==null){
- userList=new ArrayList<User>();
- }
- HttpServletRequest request=(HttpServletRequest) arg0.getServletRequest();
- //sessionId
- String 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集合 保存到ServletContext
- arg0.getServletContext().setAttribute("userList", userList);
- }
- }
工具类
- package com.scx.util;
- import java.util.ArrayList;
- import com.scx.entity.User;
- public class SessionUtil {
- //根据sessionId判断当前用户是否存在在集合中 如果存在 返回当前用户 否则返回null
- public static User getUserBySessionId(ArrayList<User> userList,String sessionId) {
- for (User user : userList) {
- if(sessionId.equals(user.getSessionId())){
- return user;
- }
- }
- return null;
- }
- }
以上是关于统计在线人数的主要内容,如果未能解决你的问题,请参考以下文章