使用Servlet监听器可以统计在线用户,具体实现方法如下:
1.通过ServletContext监听初始化一个application对象,保存在线用户列表;
2.通过Session监听当用户登录成功设置Session属性时将用户名保存在列表中;
3.通过Session监听当用户注销登录时将用户名从列表中删除。
OnlineListener.java:
- 1. package mgc.listener.test;
- 2.
- 3. import java.util.*;
- 4. import javax.servlet.*;
- 5. import javax.servlet.http.*;
- 6.
- 7. public class OnlineListener implements ServletContextListener,ServletContextAttributeListener,HttpSessionListener,HttpSessionAttributeListener {
- 8.
- 9. private ServletContext application = null ;
- 10. private HttpSession session = null ;
- 11.
- 12. public void contextInitialized(ServletContextEvent sce) {
- 13.
- 14. //初始化一个application对象
- 15. this.application=sce.getServletContext() ;
- 16. //设置一个列表属性,用于保存在线用户名
- 17. this.application.setAttribute("online", new ArrayList()) ;
- 18. }
- 19.
- 20. public void contextDestroyed(ServletContextEvent sce) {
- 21.
- 22. }
- 23.
- 24. public void attributeAdded(ServletContextAttributeEvent scab) {
- 25.
- 26. }
- 27.
- 28. public void attributeRemoved(ServletContextAttributeEvent scab) {
- 29.
- 30. }
- 31.
- 32. public void attributeReplaced(ServletContextAttributeEvent scab) {
- 33.
- 34. }
- 35.
- 36. public void sessionCreated(HttpSessionEvent se) {
- 37.
- 38. }
- 39.
- 40. public void sessionDestroyed(HttpSessionEvent se) {
- 41.
- 42. //取得用户名列表
- 43. List online=(List)this.application.getAttribute("online") ;
- 44. //取得当前用户名
- 45. String username=(String)se.getSession().getAttribute("username") ;
- 46. //将此用户名从列表中删除
- 47. online.remove(username) ;
- 48. //将删除后的列表重新设置到application属性中
- 49. this.application.setAttribute("online", online) ;
- 50. }
- 51.
- 52. public void attributeAdded(HttpSessionBindingEvent se) {
- 53.
- 54. //取得用户名列表
- 55. List online=(List)this.application.getAttribute("online") ;
- 56. //将当前用户名添加到列表中
- 57. online.add(se.getValue()) ;
- 58. //将添加后的列表重新设置到application属性中
- 59. this.application.setAttribute("online", online) ;
- 60. }
- 61.
- 62. public void attributeRemoved(HttpSessionBindingEvent se) {
- 63.
- 64. }
- 65.
- 66. public void attributeReplaced(HttpSessionBindingEvent se) {
- 67.
- 68. }
- 69. }
web.xml:
- <listener>
- <listener-class>mgc.listener.test.OnlineListener</listener-class>
- </listener>
sessionlistener.jsp:
- 1. <%@ page contentType="text/html;charset=GB2312" %>
- 2. <%@ page import="java.util.*" %>
- 3. <html>
- 4. <head>
- 5. <title>sessionlistener</title>
- 6. </head>
- 7.
- 8. <body>
- 9. <form action="onlinelistener.jsp" method="post" >
- 10. 用户名:<input type="text" name="username"/>
- 11. <input type="submit" value="登录"/>
- 12. <a href="logout.jsp" mce_href="logout.jsp">注销</a>
- 13. </form>
- 14. <%
- 15. String username=request.getParameter("username") ;
- 16. if(username != null) {
- 17.
- 18. session.setAttribute("username",username) ;
- 19. }
- 20. %>
- 21. <p>
- 22. <h3>在线用户:</h3>
- 23. <hr>
- 24. <%
- 25. List online = (List)getServletContext().getAttribute("online") ;
- 26. Iterator iter = online.iterator();
- 27. while(iter.hasNext()) {
- 28.
- 29. %>
- 30. <li><%=iter.next() %></li>
- 31. <%
- 32. }
- 33. %>
- 34. </body>
- 35. </html>
logout.jsp:
- 1. <%@ page contentType="text/html;charset=GB2312" %>
- 2. <html>
- 3. <head>
- 4. <title>logout</title>
- 5. </head>
- 6.
- 7. <body>
- 8. <%
- 9. session.invalidate() ;
- 10. response.setHeader("refresh","3;URL=onlinelistener.jsp") ;
- 11. %>
- 12. <h3>注销成功!</h3>
- 13. 3秒后自动返回登录页面<br>
- 14. 如果没有跳转,请点<a href="onlinelistener.jsp" mce_href="onlinelistener.jsp">这里</a>
- 15. </body>
- 16. </html>