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

来源:互联网 发布:诺基亚n9价格淘宝 编辑:程序博客网 时间:2024/05/01 13:41

★★★ 本篇为原创,需要引用转载的朋友请注明:《 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监听器. <br>
  12. * 在WEB容器的web.xml中添加本监听器的调用,具体格式如下:(其中的"[","]"分别用" <",">"替换) <br>
  13. *
  14. * <pre>
  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. * </pre>
  33. *
  34. * 注意在web.xml中配置的位置. <br>
  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. }

注意其中的_login就是设定的特殊session属性,当然你可以改成别的名字。

第2步 将session监听器配置到web.xml中.(参考如下的web.xml配置)

Xml代码 复制代码 收藏代码
  1. <?xmlversion="1.0"?>
  2. <!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd">
  3. <web-app>
  4. <listener><listener-class>com.stephen.filter.SessionListener</listener-class></listener>
  5. <welcome-file-list>
  6. <welcome-file>index.html</welcome-file>
  7. </welcome-file-list>
  8. </web-app>


上面的 <listener><listener-class>com.stephen.filter.SessionListener</listener-class></listener> 就是配置session监听器的。

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

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

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

Java代码 复制代码 收藏代码
  1. //记入session监听器
  2. 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. }


第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. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
  7. <html><head><title>Online session Query</title>
  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 Employee</h5>
  16. <tablewidth="100%"align="center"cellspacing="1"cellpadding="4"border="0">
  17. <trid="listTitle">
  18. <td>No.</td>
  19. <td>登录Id</td>
  20. <td>登录时间</td>
  21. <td>ip</td>
  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. %>



最后的说明:

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


原创粉丝点击