• javaWeb基础之 servlet 监听器(实战)在线人数统计


    功能描述:在线人数统计:记录在线人数,IP地址,登录时间,以及sessionId

    目的:熟悉 ServletContext 、httpRequest、httpSession 三个域的生命周期及区别

    环境:servlet 3.0 tomcat7 idea2017 jdk8 无需任何包

    注:必须servlet 3.0 以上才能使用webListener 这个注解,这样不需要在web.xml 中配置

    目录结构:

    实体类:

    package entity;
    /**
     * 建立实体类
     */
    public class User {
        private String sessionId;
        private String ipAddr;
        private String accessDate;
        public String getSessionId() {
            return sessionId;
        }
    
        public void setSessionId(String sessionId) {
            this.sessionId = sessionId;
        }
    
        public String getIpAddr() {
            return ipAddr;
        }
    
        public void setIpAddr(String ipAddr) {
            this.ipAddr = ipAddr;
        }
    
        public String getAccessDate() {
            return accessDate;
        }
    
        public void setAccessDate(String accessDate) {
            this.accessDate = accessDate;
        }
    }

    myRequestListener类:

    package listener;
    
    import entity.User;
    import util.sessionUtil;
    
    import javax.servlet.ServletRequestEvent;
    import javax.servlet.ServletRequestListener;
    import javax.servlet.annotation.WebListener;
    import javax.servlet.http.HttpServletRequest;
    import java.text.SimpleDateFormat;
    import java.util.ArrayList;
    import java.util.Date;
    import java.util.List;
    
    /** servet 3.0以上 只需要增加该注解即可作为监听器 */
    @WebListener
    public class myRequestListener implements ServletRequestListener {
        private List<User> listUser =null;
        @Override
        public void requestDestroyed(ServletRequestEvent servletRequestEvent) { }
        @Override
        public void requestInitialized(ServletRequestEvent servletRequestEvent) {
            /**
             * 逻辑理解:
             * 只能通过HttpServletRequest 获取当前请求中的session,因为HttpServletRequest 继承自 servletRequestEvent
             * 所以强制类型转化后可获取session 然后判断该sessionId 是否存在于已有的list 中,不存在则新增一个
             */
            HttpServletRequest httpServletRequest = (HttpServletRequest)servletRequestEvent.getServletRequest();
            listUser = (List<User>)httpServletRequest.getSession().getServletContext().getAttribute("UserList");
            if(listUser==null){
                listUser = new ArrayList<>();
            }
            //判断是否该sessionId是否存在
            String sessionId = httpServletRequest.getSession().getId();
            if(sessionUtil.getSessionUser(listUser,sessionId)==null) {
                User user = new User();
                user.setSessionId(httpServletRequest.getSession().getId());//id
                user.setIpAddr(httpServletRequest.getRemoteAddr());//ip
                user.setAccessDate(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));
                listUser.add(user);
            }
            //以上动作完成后,则将该集合放入 ServletContext 域中提供给其他地方使用。
            httpServletRequest.getSession().getServletContext().setAttribute("UserList",listUser);
    
        }
    
    
    }

    mySessionListener类:

    package listener;
    
    import entity.User;
    import util.sessionUtil;
    
    import javax.servlet.annotation.WebListener;
    import javax.servlet.http.HttpSessionEvent;
    import javax.servlet.http.HttpSessionListener;
    import java.util.List;
    
    /** servet 3.0以上 只需要增加该注解即可作为监听器 */
    @WebListener
    public class mySessionListener implements HttpSessionListener {
    
        private int userNumber =0;
        @Override
        public void sessionCreated(HttpSessionEvent httpSessionEvent) {
            /** userNumber可计算当前在线人数 在httpSession域 进行增删一旦session过期则会自动调用sessionDestroyed 进行-1  */
                userNumber++;
                httpSessionEvent.getSession().getServletContext().setAttribute("userNumber",userNumber);
        }
        @Override
        public void sessionDestroyed(HttpSessionEvent httpSessionEvent) {
            userNumber--;
            httpSessionEvent.getSession().getServletContext().setAttribute("userNumber",userNumber);
            /** 获取servletContext 域中 UserList 如果存在这个sessionId 就将这个对象从集合中删除。 */
            List<User> listUser =(List<User> )httpSessionEvent.getSession().getServletContext().getAttribute("UserList");
            String sessionId=httpSessionEvent.getSession().getId();
            User user = sessionUtil.getSessionUser(listUser,sessionId);
            if(user != null) {
                listUser.remove(user);
            }
        }
    }

    sessionUtil 类:

    package util;
    
    import entity.User;
    
    import java.util.List;
    
    public class sessionUtil {
        /**
         * 判断是否存在该session
         * @param listUser userList
         * @param sessionId 当前sessionID
         * @return
         */
        public static User getSessionUser(List<User> listUser, String sessionId) {
                for (int i = 0; i < listUser.size(); i++) {
                    User user = listUser.get(i);
                    if (user.getSessionId() .equals( sessionId)) {
                        return user;
                    }
                }
             return null;
    
        }
    }

    index.jsp:

    <%@ page import="entity.User" %>
    <%@ page import="java.util.List" %>
    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <html>
      <head>
        <title>$Title$</title>
      </head>
      <body>
      当前在线人数<p>${userNumber}</p></br>
      <%
       List<User> listUser =  (List<User>) request.getSession().getServletContext().getAttribute("UserList");
       if(listUser.size()>0){
        for (int i = 0; i < listUser.size(); i++) {
          User user =  (User)listUser.get(i);
        %>
      <p> 详情: <%=user.getSessionId()%>---<%=user.getIpAddr()%>---<%=user.getAccessDate()%></p>
    
      <%}}%>
      </body>
    </html>

    效果如下:

  • 相关阅读:
    【WPF】【基础】布局系统
    【设计】【托管扩展性框架】 MEF vs 2010 samples
    【wpf】【控件】内容控件
    【Wpf】【debug】Exception has been thrown by the target of an invocation.
    【设计模式】概述
    期待与悲催中的2012
    金额转为大写人民币
    使用vs2005的GridView控件,菜鸟问题。
    Microsoft Visual Studio 2005中使用水晶报表
    将金额小写转化成汉字大写(javascript)
  • 原文地址:https://www.cnblogs.com/lanSeGeDiao/p/9333139.html
Copyright © 2020-2023  润新知