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

★★★ 本篇为原创,需要引用转载的朋友请注明:《 http://stephen830.iteye.com/blog/338291 》 谢谢支持! ★★★

在系统运行中,有时候我们想了解下当前使用系统的用户,有多少人在使用系统?具体是哪些人在使用系统?

这时候,就可以通过session监听器(javax.servlet.http.HttpSessionAttributeListener 接口)的功能来实现。当用户登录系统的时候,通过特定的session属性记录下用户的登录情况。

整个过程可以分为以下4步:

第1步 准备session监听器处理类。
(如下面的SessionListener.java)

Java代码 复制代码 收藏代码
  1. /*
  2. * @(#)SessionListener.java 1.00 2009/02/20
  3. * CopyRight(C) stephen(zhoujianqiang AT gmail DOT com) 2009-2014, All rights reserved.
  4. */
  5. package com.stephen.filter;
  6. import java.util.ArrayList;
  7. import java.util.List;
  8. import javax.servlet.http.HttpSessionAttributeListener;
  9. import javax.servlet.http.HttpSessionBindingEvent;
  10. /**
  11. * session监听器.
  12. * 在WEB容器的web.xml中添加本监听器的调用,具体格式如下:(其中的"[","]"分别用" <",">"替换)
  13. *
  14. *
     
  15. *
  16. * [web-app]
  17. * [filter]
  18. * ...
  19. * [/filter]
  20. * [filter-mapping]
  21. * ...
  22. * [/filter-mapping]
  23. * ...
  24. * [listener][listener-class]com.stephen.filter.SessionListener[/listener-class][/listener]
  25. * ...
  26. * [servlet]
  27. * ...
  28. * [/servlet]
  29. * ...
  30. * [/web-app]
  31. *
  32. *
  33. *
  34. * 注意在web.xml中配置的位置.
  35. *
  36. * @author stephen
  37. * @version 1.00
  38. * @see javax.servlet.http.HttpSessionAttributeListener
  39. */
  40. public class SessionListenerimplements HttpSessionAttributeListener {
  41. /**
  42. * 定义监听的session属性名.
  43. */
  44. public finalstatic String LISTENER_NAME = "_login";
  45. /**
  46. * 定义存储客户登录session的集合.
  47. */
  48. private static List sessions =new ArrayList();
  49. /**
  50. * 加入session时的监听方法.
  51. *
  52. * @param HttpSessionBindingEvent
  53. * session事件
  54. */
  55. public void attributeAdded(HttpSessionBindingEvent sbe) {
  56. if (LISTENER_NAME.equals(sbe.getName())) {
  57. sessions.add(sbe.getValue());
  58. }
  59. }
  60. /**
  61. * session失效时的监听方法.
  62. *
  63. * @param HttpSessionBindingEvent
  64. * session事件
  65. */
  66. public void attributeRemoved(HttpSessionBindingEvent sbe) {
  67. if (LISTENER_NAME.equals(sbe.getName())) {
  68. sessions.remove(sbe.getValue());
  69. }
  70. }
  71. /**
  72. * session覆盖时的监听方法.
  73. *
  74. * @param HttpSessionBindingEvent
  75. * session事件
  76. */
  77. public void attributeReplaced(HttpSessionBindingEvent sbe) {
  78. }
  79. /**
  80. * 返回客户登录session的集合.
  81. *
  82. * @return
  83. */
  84. public static List getSessions() {
  85. return sessions;
  86. }
  87. }
/*
 * @(#)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监听器. 
* 在WEB容器的web.xml中添加本监听器的调用,具体格式如下:(其中的"[","]"分别用" <",">"替换)
* *
 * 
 *    [web-app]
 *    [filter]
 *    ...
 *    [/filter]
 *    [filter-mapping]
 *    ...
 *    [/filter-mapping]
 *    ...
 *    [listener][listener-class]com.stephen.filter.SessionListener[/listener-class][/listener]
 *    ...
 *    [servlet]
 *    ...
 *    [/servlet]
 *    ...
 *    [/web-app]
 *  
 * 
* * 注意在web.xml中配置的位置.
* * @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代码 复制代码 收藏代码
  1. xmlversion="1.0"?>
  2. >
  3. <web-app>
  4. <listener><listener-class>com.stephen.filter.SessionListenerlistener-class>listener>
  5. <welcome-file-list>
  6. <welcome-file>index.htmlwelcome-file>
  7. welcome-file-list>
  8. web-app>


上面的 com.stephen.filter.SessionListener 就是配置session监听器的。

在你的web.xml配置文件中添加上这一行就可以了(要注意添加的位置)。

第3步 当用户登录时监听用户。

当用户成功登录后执行下面的代码。

Java代码 复制代码 收藏代码
  1. //记入session监听器
  2. 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代码 复制代码 收藏代码
  1. /*
  2. * @(#)OnlineSession.java 1.00 2009/02/20
  3. * CopyRight(C) stephen(zhoujianqiang AT gmail DOT com) 2009-2014, All rights reserved.
  4. */
  5. package com.stephen.filter;
  6. /**
  7. * 客户session信息.
  8. *
  9. * @author stephen
  10. * @version 1.0.0
  11. */
  12. public finalclass OnlineSession {
  13. /**
  14. * 客户计算机的ip.
  15. */
  16. private String ip = null;
  17. /**
  18. * 客户登录名.
  19. */
  20. private String loginId = null;
  21. /**
  22. * 客户登录系统时间.
  23. */
  24. private String onlineTime = null;
  25. /**
  26. * 构造器.
  27. * @param ip
  28. * @param loginId
  29. * @param onlineTime
  30. */
  31. public OnlineSession(String ip,String loginId,String onlineTime){
  32. this.ip=ip;
  33. this.loginId=loginId;
  34. this.onlineTime=onlineTime;
  35. }
  36. /**
  37. * @return Returns the ip.
  38. */
  39. public String getIp() {
  40. return ip;
  41. }
  42. /**
  43. * @param ip The ip to set.
  44. */
  45. public void setIp(String ip) {
  46. this.ip = ip;
  47. }
  48. /**
  49. * @return Returns the loginId.
  50. */
  51. public String getLoginId() {
  52. return loginId;
  53. }
  54. /**
  55. * @param loginId The loginId to set.
  56. */
  57. public void setLoginId(String loginId) {
  58. this.loginId = loginId;
  59. }
  60. /**
  61. * @return Returns the onlineTime.
  62. */
  63. public String getOnlineTime() {
  64. return onlineTime;
  65. }
  66. /**
  67. * @param onlineTime The onlineTime to set.
  68. */
  69. public void setOnlineTime(String onlineTime) {
  70. this.onlineTime = onlineTime;
  71. }
  72. }
/*
 * @(#)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代码
  1. <%@ pagecontentType="text/html;charset=UTF-8"%>
  2. <%@ pageimport="java.util.List"%>
  3. <%@ pageimport="java.util.Iterator"%>
  4. <%@ pageimport="com.stephen.filter.SessionListener"%>
  5. <%@ pageimport="com.stephen.filter.OnlineSession"%>
  6. >
  7. <html><head><title>Online session Querytitle>
  8. <metahttp-equiv="Content-Type"content="text/html; charset=UTF-8">
  9. head><bodybgcolor="#e5ecf9"topmargin="5px"leftmargin="5px"rightmargin="5px">
  10. <%
  11. List sessions =SessionListener.getSessions();
  12. String pageErrorInfo =null;
  13. try{
  14. %>
  15. <h5>Online Employeeh5>
  16. <tablewidth="100%"align="center"cellspacing="1"cellpadding="4"border="0">
  17. <trid="listTitle">
  18. <td>No.td>
  19. <td>登录Idtd>
  20. <td>登录时间td>
  21. <td>iptd>
  22. tr>
  23. <%
  24. StringBuffer datas =new StringBuffer();
  25. if(sessions!=null){
  26. OnlineSession onlineSession =null;
  27. Iterator it =sessions.iterator();
  28. int count=0;
  29. while(it.hasNext()){
  30. count++;
  31. onlineSession=(OnlineSession)it.next();
  32. datas.append("<tr><td>");
  33. datas.append(count);
  34. datas.append("td><td>");
  35. datas.append(onlineSession.getLoginId());
  36. datas.append("td><td>");
  37. datas.append(onlineSession.getOnlineTime());
  38. datas.append("td><td>");
  39. datas.append(onlineSession.getIp());
  40. datas.append("td>tr>");
  41. }
  42. }
  43. out.print(datas.toString());
  44. %>
  45. table>
  46. <%
  47. }catch(Exception e){
  48. pageErrorInfo = e.toString();
  49. }finally{
  50. if(pageErrorInfo!=null){
  51. %>
  52. <fontcolor="red">Error:<%=pageErrorInfo%>font>
  53. <%
  54. }
  55. %>
  56. body>html>
  57. <%
  58. }
  59. %>
<%@ 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"%>

Online session Query


<%
	List sessions = SessionListener.getSessions();
	String pageErrorInfo = null;
	try{
%>
		
Online Employee
<% 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(""); } } out.print(datas.toString()); %>
No. 登录Id 登录时间 ip
"); datas.append(count); datas.append(""); datas.append(onlineSession.getLoginId()); datas.append(""); datas.append(onlineSession.getOnlineTime()); datas.append(""); datas.append(onlineSession.getIp()); datas.append("
<% }catch(Exception e){ pageErrorInfo = e.toString(); }finally{ if(pageErrorInfo!=null){ %> Error:<%=pageErrorInfo%> <% } %> <% } %>



最后的说明:

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


你可能感兴趣的:(java)