session监听器(可用于统计在线人数,了解系统当前的使用客户)

    技术2022-05-20  54

    session监听器(可用于统计在线人数,了解系统当前的使用客户)

     

    http://stephen830.javaeye.com/blog/338291

     

    ★★★ 本篇为原创,需要引用转载的朋友请注明:《 http://stephen830.javaeye.com/blog/338291 》 谢谢支持! ★★★ 在系统运行中,有时候我们想了解下当前使用系统的用户,有多少人在使用系统?具体是哪些人在使用系统? 这时候,就可以通过session监听器(javax.servlet.http.HttpSessionAttributeListener 接口)的功能来实现。当用户登录系统的时候,通过特定的session属性记录下用户的登录情况。 整个过程可以分为以下4步: 第1步 准备session监听器处理类。 (如下面的SessionListener.java)

    Java代码 /*    * @(#)SessionListener.java 1.00    2009/02/20    * CopyRight(C) stephen(zhoujianqiang AT gmail DOT com) 2009-2014, All rights reserved.    */    package  com.stephen.filter;      import  java.util.ArrayList;   import  java.util.List;   import  javax.servlet.http.HttpSessionAttributeListener;   import  javax.servlet.http.HttpSessionBindingEvent;      /**    * session监听器. <br>    * 在WEB容器的web.xml中添加本监听器的调用,具体格式如下:(其中的"[","]"分别用" <",">"替换) <br>    *     * <pre>    *     *    [web-app]    *    [filter]    *    ...    *    [/filter]    *    [filter-mapping]    *    ...    *    [/filter-mapping]    *    ...    *    [listener][listener-class]com.stephen.filter.SessionListener[/listener-class][/listener]    *    ...    *    [servlet]    *    ...    *    [/servlet]    *    ...    *    [/web-app]    *      * </pre>    *     * 注意在web.xml中配置的位置. <br>    *     * @author stephen    * @version 1.00    * @see javax.servlet.http.HttpSessionAttributeListener    */    public   class  SessionListener  implements  HttpSessionAttributeListener {       /**        * 定义监听的session属性名.        */        public   final   static  String LISTENER_NAME =  "_login" ;              /**        * 定义存储客户登录session的集合.        */        private   static  List sessions =  new  ArrayList();          /**        * 加入session时的监听方法.        *         * @param HttpSessionBindingEvent        *            session事件        */        public   void  attributeAdded(HttpSessionBindingEvent sbe) {           if  (LISTENER_NAME.equals(sbe.getName())) {               sessions.add(sbe.getValue());           }       }          /**        * session失效时的监听方法.        *         * @param HttpSessionBindingEvent        *            session事件        */        public   void  attributeRemoved(HttpSessionBindingEvent sbe) {           if  (LISTENER_NAME.equals(sbe.getName())) {               sessions.remove(sbe.getValue());           }       }          /**        * session覆盖时的监听方法.        *         * @param HttpSessionBindingEvent        *            session事件        */        public   void  attributeReplaced(HttpSessionBindingEvent sbe) {       }          /**        * 返回客户登录session的集合.        *         * @return        */        public   static  List getSessions() {           return  sessions;       }   }   /* * @(#)SessionListener.java 1.00 2009/02/20 * CopyRight(C) stephen(zhoujianqiang AT gmail DOT com) 2009-2014, All rights reserved. */ package com.stephen.filter; import java.util.ArrayList; import java.util.List; import javax.servlet.http.HttpSessionAttributeListener; import javax.servlet.http.HttpSessionBindingEvent; /** * session监听器. <br> * 在WEB容器的web.xml中添加本监听器的调用,具体格式如下:(其中的"[","]"分别用" <",">"替换) <br> * * <pre> * * [web-app] * [filter] * ... * [/filter] * [filter-mapping] * ... * [/filter-mapping] * ... * [listener][listener-class]com.stephen.filter.SessionListener[/listener-class][/listener] * ... * [servlet] * ... * [/servlet] * ... * [/web-app] * * </pre> * * 注意在web.xml中配置的位置. <br> * * @author stephen * @version 1.00 * @see javax.servlet.http.HttpSessionAttributeListener */ public class SessionListener implements HttpSessionAttributeListener { /** * 定义监听的session属性名. */ public final static String LISTENER_NAME = "_login"; /** * 定义存储客户登录session的集合. */ private static List sessions = new ArrayList(); /** * 加入session时的监听方法. * * @param HttpSessionBindingEvent * session事件 */ public void attributeAdded(HttpSessionBindingEvent sbe) { if (LISTENER_NAME.equals(sbe.getName())) { sessions.add(sbe.getValue()); } } /** * session失效时的监听方法. * * @param HttpSessionBindingEvent * session事件 */ public void attributeRemoved(HttpSessionBindingEvent sbe) { if (LISTENER_NAME.equals(sbe.getName())) { sessions.remove(sbe.getValue()); } } /** * session覆盖时的监听方法. * * @param HttpSessionBindingEvent * session事件 */ public void attributeReplaced(HttpSessionBindingEvent sbe) { } /** * 返回客户登录session的集合. * * @return */ public static List getSessions() { return sessions; } }

    注意其中的_login就是设定的特殊session属性,当然你可以改成别的名字。 第2步 将session监听器配置到web.xml中. (参考如下的web.xml配置)

    Xml代码 <? xml   version = "1.0"   ?>    <!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd">    < web-app >                   < listener > < listener-class > com.stephen.filter.SessionListener </ listener-class > </ listener >           < welcome-file-list >            < welcome-file > index.html </ welcome-file >        </ welcome-file-list >       </ web-app >    <?xml version="1.0" ?> <!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd"> <web-app> <listener><listener-class>com.stephen.filter.SessionListener</listener-class></listener> <welcome-file-list> <welcome-file>index.html</welcome-file> </welcome-file-list> </web-app>

    上面的 <listener><listener-class>com.stephen.filter.SessionListener</listener-class></listener> 就是配置session监听器的。 在你的web.xml配置文件中添加上这一行就可以了(要注意添加的位置)。 第3步 当用户登录时监听用户。 当用户成功登录后执行下面的代码。

    Java代码 //记入session监听器    session.setAttribute(com.stephen.filter.SessionListener.LISTENER_NAME,new  OnlineSession(request.getRemoteAddr(),userName, new  Date().toString()));   //记入session监听器 session.setAttribute(com.stephen.filter.SessionListener.LISTENER_NAME,new OnlineSession(request.getRemoteAddr(),userName,new Date().toString()));

    注意在上面的代码中使用了新的OnlineSession类,OnlineSession类封装了登录用户的信息(如用户ip,用户名,登录时间). OnlineSession具体的内容如下:

    Java代码 /*    * @(#)OnlineSession.java   1.00    2009/02/20    * CopyRight(C) stephen(zhoujianqiang AT gmail DOT com) 2009-2014, All rights reserved.    */    package  com.stephen.filter;      /**    * 客户session信息.    *     * @author  stephen    * @version 1.0.0    */    public   final   class  OnlineSession {                     /**        * 客户计算机的ip.        */        private  String ip =  null ;       /**        * 客户登录名.        */        private  String loginId =  null ;       /**        * 客户登录系统时间.        */        private  String onlineTime =  null ;              /**        * 构造器.        * @param ip        * @param loginId        * @param onlineTime        */        public  OnlineSession(String ip,String loginId,String onlineTime){           this .ip=ip;           this .loginId=loginId;           this .onlineTime=onlineTime;       }              /**        * @return Returns the ip.        */        public  String getIp() {           return  ip;       }       /**        * @param ip The ip to set.        */        public   void  setIp(String ip) {           this .ip = ip;       }       /**        * @return Returns the loginId.        */        public  String getLoginId() {           return  loginId;       }       /**        * @param loginId The loginId to set.        */        public   void  setLoginId(String loginId) {           this .loginId = loginId;       }       /**        * @return Returns the onlineTime.        */        public  String getOnlineTime() {           return  onlineTime;       }       /**        * @param onlineTime The onlineTime to set.        */        public   void  setOnlineTime(String onlineTime) {           this .onlineTime = onlineTime;       }   }   /* * @(#)OnlineSession.java 1.00 2009/02/20 * CopyRight(C) stephen(zhoujianqiang AT gmail DOT com) 2009-2014, All rights reserved. */ package com.stephen.filter; /** * 客户session信息. * * @author stephen * @version 1.0.0 */ public final class OnlineSession { /** * 客户计算机的ip. */ private String ip = null; /** * 客户登录名. */ private String loginId = null; /** * 客户登录系统时间. */ private String onlineTime = null; /** * 构造器. * @param ip * @param loginId * @param onlineTime */ public OnlineSession(String ip,String loginId,String onlineTime){ this.ip=ip; this.loginId=loginId; this.onlineTime=onlineTime; } /** * @return Returns the ip. */ public String getIp() { return ip; } /** * @param ip The ip to set. */ public void setIp(String ip) { this.ip = ip; } /** * @return Returns the loginId. */ public String getLoginId() { return loginId; } /** * @param loginId The loginId to set. */ public void setLoginId(String loginId) { this.loginId = loginId; } /** * @return Returns the onlineTime. */ public String getOnlineTime() { return onlineTime; } /** * @param onlineTime The onlineTime to set. */ public void setOnlineTime(String onlineTime) { this.onlineTime = onlineTime; } }

    第4步 显示在线用户的情况。 可以直接通过 SessionListener.getSessions()方法来取得所有在线的用户。

    Html代码 < %@ page  contentType = "text/html;charset=UTF-8" % >    < %@ page  import = "java.util.List" % >    < %@ page  import = "java.util.Iterator" % >    < %@ page  import = "com.stephen.filter.SessionListener" % >    < %@ page  import = "com.stephen.filter.OnlineSession" % >    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">    < html > < head > < title > Online session Query </ title >    < meta   http-equiv = "Content-Type"   content = "text/html; charset=UTF-8" >    </ head > < body   bgcolor = "#e5ecf9"   topmargin = "5px"   leftmargin = "5px"   rightmargin = "5px" >    < %       List sessions  =  SessionListener .getSessions();       String pageErrorInfo  =  null ;       try{   %>            < h5 > Online Employee </ h5 >                       < table   width = "100%"   align = "center"   cellspacing = "1"   cellpadding = "4"   border = "0" >            < tr   id = "listTitle" >            < td > No. </ td >            < td > 登录Id </ td >            < td > 登录时间 </ td >            < td > ip </ td >            </ tr >    < %           StringBuffer datas  =  new  StringBuffer();           if(sessions!=null){               OnlineSession onlineSession  =  null ;               Iterator it  =  sessions .iterator();               int count = 0 ;               while(it.hasNext()){                   count++;                   onlineSession =(OnlineSession)it.next();                   datas.append("< tr > < td > ");                   datas.append(count);                   datas.append("</ td > < td > ");                   datas.append(onlineSession.getLoginId());                   datas.append("</ td > < td > ");                   datas.append(onlineSession.getOnlineTime());                   datas.append("</ td > < td > ");                   datas.append(onlineSession.getIp());                   datas.append("</ td > </ tr > ");               }           }           out.print(datas.toString());   %>            </ table >    < %       }catch(Exception e){           pageErrorInfo  = e.toString();       }finally{           if(pageErrorInfo!=null){   %>                < font   color = "red" > Error: < %=pageErrorInfo% > </ font >    < %           }   %>            </ body > </ html >    < %              }   %>    <%@ page contentType="text/html;charset=UTF-8"%> <%@ page import="java.util.List"%> <%@ page import="java.util.Iterator"%> <%@ page import="com.stephen.filter.SessionListener"%> <%@ page import="com.stephen.filter.OnlineSession"%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html><head><title>Online session Query</title> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> </head><body bgcolor="#e5ecf9" topmargin="5px" leftmargin="5px" rightmargin="5px"> <% List sessions = SessionListener.getSessions(); String pageErrorInfo = null; try{ %> <h5>Online Employee</h5> <table width="100%" align="center" cellspacing="1" cellpadding="4" border="0"> <tr id="listTitle"> <td>No.</td> <td>登录Id</td> <td>登录时间</td> <td>ip</td> </tr> <% StringBuffer datas = new StringBuffer(); if(sessions!=null){ OnlineSession onlineSession = null; Iterator it = sessions.iterator(); int count=0; while(it.hasNext()){ count++; onlineSession=(OnlineSession)it.next(); datas.append("<tr><td>"); datas.append(count); datas.append("</td><td>"); datas.append(onlineSession.getLoginId()); datas.append("</td><td>"); datas.append(onlineSession.getOnlineTime()); datas.append("</td><td>"); datas.append(onlineSession.getIp()); datas.append("</td></tr>"); } } out.print(datas.toString()); %> </table> <% }catch(Exception e){ pageErrorInfo = e.toString(); }finally{ if(pageErrorInfo!=null){ %> <font color="red">Error:<%=pageErrorInfo%></font> <% } %> </body></html> <% } %>

    最后的说明: 如果你的系统中有注销(或者退出登录)类似的功能(功能中调用了 session.invalidate() 方法),那么用户的信息就会自动从上面的列表中删除。如果没有使用注销功能,则只能等到session超时候才能从列表中自动删除。


    最新回复(0)