zoukankan      html  css  js  c++  java
  • java-监听器(Listener)

    博客已迁移到CSDN《https://blog.csdn.net/qq_33375499

    监听器:用于监听web应用中某些对象、信息的创建、销毁等动作,服务器会自动调用相应的方法进行处理。常用于统计在线人数,初始化系统参数等。

    Javaweb监听器主要监听对象有ServletContextHttpSessionServletRequest

     

    下面是贴上一个统计登录人信息的栗子:

      在web.xml 中配置监听器:

    <!--用户登录监听器-->
        <listener>
            <listener-class>com.xxx.listener.SessionListener</listener-class>
        </listener>

      创建监听器:

    import javax.servlet.ServletRequestEvent;
    import javax.servlet.ServletRequestListener;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpSession;
    import javax.servlet.http.HttpSessionEvent;
    import javax.servlet.http.HttpSessionListener;
    import java.util.*;
    
    public class SessionListener implements HttpSessionListener,ServletRequestListener {
        // 定义监听类对象,用于存储所有用户的登录信息
        private static Map<String,String> userList = new HashMap<String, String>();
        // 定义session  map对象
        private static Map<String,HttpSession> sessionMap = new HashMap<String, HttpSession>();
    
        private HttpServletRequest request = null;
    
        @Override
        public void sessionCreated(HttpSessionEvent httpSessionEvent) {// 监听 session 创建
    
        }
    
        @Override
        public void sessionDestroyed(HttpSessionEvent httpSessionEvent) {// 监听 session 销毁
            HttpSession httpSession = httpSessionEvent.getSession();
            // 获取登录用户名
            String username = (String) httpSession.getAttribute("username");
            if(username != null){
                Iterator iterator = userList.entrySet().iterator();
                Map map = null;
                String logmsg = null;
                // 遍历 userList:将userlist中的用户信息删除
                while (iterator.hasNext()){
                    map = (Map) iterator.next();
                    if(map.get(username) != null){
                        logmsg = (String) map.get(username);
                        if(logmsg.indexOf(request.getLocalAddr()) > -1){
                            userList.remove(username);
                            sessionMap.remove(username);
                            break;
                        }
                    }
                }
            }
        }
    
        @Override
        public void requestDestroyed(ServletRequestEvent servletRequestEvent) {// 监听 request 销毁
    
        }
    
        @Override
        public void requestInitialized(ServletRequestEvent servletRequestEvent) {// 监听 request 创建
            this.request = (HttpServletRequest) servletRequestEvent.getServletRequest();
            HttpSession httpSession = this.request.getSession();
            // 获取登录用户名
            String username = (String) httpSession.getAttribute("username");
            if(username != null){
                // 如果 userList为空直接 put
                if(userList.isEmpty()){
                    userList.put(username,"IP: " + request.getLocalAddr() + " ,logtime:" + ProUtil.getStrDatetime(new Date()));
                    sessionMap.put(username,httpSession);
                    return;
                }
                String logmsg = null;
                if(userList.get(username) == null){
                    userList.put(username,"IP: " + request.getLocalAddr() + " ,logtime:" + ProUtil.getStrDatetime(new Date()));
                    sessionMap.put(username,httpSession);
                }else {
                    logmsg = userList.get(username);
                    if(logmsg.indexOf(request.getLocalAddr()) > -1){
                        userList.put(username,"IP: " + request.getLocalAddr() + " ,logtime:" + ProUtil.getStrDatetime(new Date()));
                        sessionMap.put(username,httpSession);
                    }else {
                        userList.put(username,"IP: " + request.getLocalAddr() + " ,logtime:" + ProUtil.getStrDatetime(new Date()));
                        sessionMap.get(username).setAttribute("logError","该账号已经在其他地方登录!!!");
                        sessionMap.put(username,httpSession);
                    }
                }
            }
        }
    }
  • 相关阅读:
    6月16日
    9月15日
    9月14日
    9月13日
    9月12日
    6月11日
    梦断代码阅读笔记
    11周总结
    梦断代码阅读笔记
    10第一阶段意见评论
  • 原文地址:https://www.cnblogs.com/www-123456/p/11010272.html
Copyright © 2011-2022 走看看