一、統計在線人數
1.監聽器
- package ?com.logcd.listener; ??
- ??
- import ?javax.servlet.ServletContext;? ??
- import ?javax.servlet.http.HttpSessionEvent;? ??
- import ?javax.servlet.http.HttpSessionListener;? ??
- ??
- public ? class ?SessionCounter? implements ?HttpSessionListener?{? ??
- ???? public ? void ?sessionCreated(HttpSessionEvent?event)?{? ??
- ????????ServletContext?ctx?=?event.getSession(?).getServletContext(?);? ??
- ????????Integer?numSessions?=?(Integer)?ctx.getAttribute( "numSessions" );? ??
- ???????? if ?(numSessions?==? null )?{? ??
- ????????????numSessions?=? new ?Integer( 1 );? ??
- ????????} else ?{? ??
- ???????????? int ?count?=?numSessions.intValue(?);? ??
- ????????????numSessions?=? new ?Integer(count?+? 1 );? ??
- ????????}? ??
- ????????ctx.setAttribute( "numSessions" ,?numSessions);? ??
- ????}? ??
- ???? public ? void ?sessionDestroyed(HttpSessionEvent?event)?{? ??
- ????????ServletContext?ctx?=?event.getSession(?).getServletContext(?);? ??
- ????????Integer?numSessions?=?(Integer)?ctx.getAttribute( "numSessions" );? ??
- ???????? if ?(numSessions?==? null )?{? ??
- ????????????numSessions?=? new ?Integer( 0 );? ??
- ????????}? ??
- ???????? else ?{? ??
- ???????????? int ?count?=?numSessions.intValue(?);? ??
- ????????????numSessions?=? new ?Integer(count?-? 1 );? ??
- ????????}? ??
- ????????ctx.setAttribute( "numSessions" ,?numSessions);? ??
- ????}? ??
- }???
package com.logcd.listener; import javax.servlet.ServletContext; import javax.servlet.http.HttpSessionEvent; import javax.servlet.http.HttpSessionListener; public class SessionCounter implements HttpSessionListener { public void sessionCreated(HttpSessionEvent event) { ServletContext ctx = event.getSession( ).getServletContext( ); Integer numSessions = (Integer) ctx.getAttribute("numSessions"); if (numSessions == null) { numSessions = new Integer(1); }else { int count = numSessions.intValue( ); numSessions = new Integer(count + 1); } ctx.setAttribute("numSessions", numSessions); } public void sessionDestroyed(HttpSessionEvent event) { ServletContext ctx = event.getSession( ).getServletContext( ); Integer numSessions = (Integer) ctx.getAttribute("numSessions"); if (numSessions == null) { numSessions = new Integer(0); } else { int count = numSessions.intValue( ); numSessions = new Integer(count - 1); } ctx.setAttribute("numSessions", numSessions); } }
說明:實現了HttpSessionListener定義的兩個方法:sessionCreated()和sessionDestroyed()。這兩個方法可以監聽到當前應用中session的創建和銷毀情況。
以下兩種情況下就會發生sessionDestoryed(會話銷毀)事件:
(1)執行session.invalidate()方法時。
(2)如果用戶長時間沒有訪問服務器,超過了會話最大超時時間,服務器就會自動銷毀超時的session。
- < session-config > ??
- ???? < session-timeout > 1 </ session-timeout > ??
- </ session-config > ??
<session-config> <session-timeout>1</session-timeout> </session-config>
時間單位是一分鐘,并且只能是整數,如果是零或負數,那么會話就永遠不會超時。
2.web.xml中配置
- < listener > ? ??
- ????? < listener-class > com.logcd.listener.SessionCounter </ listener-class > ? ??
- </ listener > ???
<listener> <listener-class>com.logcd.listener.SessionCounter</listener-class> </listener>
3.jsp調用
- 目前共有 < span ? class = "salient" > ? < %=application.getAttribute("numSessions")% > ? </ span > 人在線??
目前共有<span class="salient"> <%=application.getAttribute("numSessions")%> </span>人在線
二、統計注冊人數
1.監聽器
- package ?com.logcd.listener; ??
- ??
- import ?java.util.HashMap; ??
- import ?java.util.Map; ??
- ??
- import ?javax.servlet.ServletContext; ??
- import ?javax.servlet.http.HttpSession; ??
- import ?javax.servlet.http.HttpSessionBindingEvent; ??
- import ?javax.servlet.http.HttpSessionBindingListener; ??
- ??
- public ? class ?OnlineUserBindingListener? implements ?HttpSessionBindingListener{ ??
- ??
- ???? private ?String?userId; ??
- ???? private ?String?userName; ??
- ???? ??
- ???? public ?OnlineUserBindingListener(String?userId,String?username){ ??
- ???????? this .setUserId(userId); ??
- ???????? this .setUserName(userName); ??
- ????} ??
- ???? ??
- ???? @SuppressWarnings ( "unchecked" ) ??
- ???? public ? void ?valueBound(HttpSessionBindingEvent?event)?{ ??
- ????????HttpSession?session?=?event.getSession(); ??
- ????????ServletContext?application?=?session.getServletContext(); ??
- ??
- ???????? //?把用戶放入在線列表 ??
- ????????Map?onlineUserList?=?(Map)?application.getAttribute( "onlineUserList" ); ??
- ???????? //?第一次使用前,需要初始化 ??
- ???????? if ?(onlineUserList?==? null )?{ ??
- ????????????onlineUserList?=? new ?HashMap(); ??
- ????????????application.setAttribute( "onlineUserList" ,?onlineUserList); ??
- ????????} ??
- ????????onlineUserList.put( this .userId,? this .userName); ??
- ???????? ??
- ????} ??
- ??
- ???? public ? void ?valueUnbound(HttpSessionBindingEvent?event)?{ ??
- ????????HttpSession?session?=?event.getSession(); ??
- ????????ServletContext?application?=?session.getServletContext(); ??
- ??
- ???????? //?從在線列表中刪除用戶 ??
- ????????Map?onlineUserList?=?(Map)?application.getAttribute( "onlineUserList" ); ??
- ????????onlineUserList.remove( this .userId); ??
- ???????? ??
- ????} ??
- ??
- ??
- ???? public ?String?getUserId()?{ ??
- ???????? return ?userId; ??
- ????} ??
- ??
- ???? public ? void ?setUserId(String?userId)?{ ??
- ???????? this .userId?=?userId; ??
- ????} ??
- ??
- ???? public ?String?getUserName()?{ ??
- ???????? return ?userName; ??
- ????} ??
- ??
- ???? public ? void ?setUserName(String?userName)?{ ??
- ???????? this .userName?=?userName; ??
- ????} ??
- ??
- }??
package com.logcd.listener; import java.util.HashMap; import java.util.Map; import javax.servlet.ServletContext; import javax.servlet.http.HttpSession; import javax.servlet.http.HttpSessionBindingEvent; import javax.servlet.http.HttpSessionBindingListener; public class OnlineUserBindingListener implements HttpSessionBindingListener{ private String userId; private String userName; public OnlineUserBindingListener(String userId,String username){ this.setUserId(userId); this.setUserName(userName); } @SuppressWarnings("unchecked") public void valueBound(HttpSessionBindingEvent event) { HttpSession session = event.getSession(); ServletContext application = session.getServletContext(); // 把用戶放入在線列表 Map onlineUserList = (Map) application.getAttribute("onlineUserList"); // 第一次使用前,需要初始化 if (onlineUserList == null) { onlineUserList = new HashMap(); application.setAttribute("onlineUserList", onlineUserList); } onlineUserList.put(this.userId, this.userName); } public void valueUnbound(HttpSessionBindingEvent event) { HttpSession session = event.getSession(); ServletContext application = session.getServletContext(); // 從在線列表中刪除用戶 Map onlineUserList = (Map) application.getAttribute("onlineUserList"); onlineUserList.remove(this.userId); } public String getUserId() { return userId; } public void setUserId(String userId) { this.userId = userId; } public String getUserName() { return userName; } public void setUserName(String userName) { this.userName = userName; } }
說明:實現了HttpSessionBindingListener接口,接口中共定義了兩個方法:valueBound()和valueUnbound(),分別對應數據綁定,和取消綁定兩個事件。
所謂對session進行數據綁定,就是調用session.setAttribute()把HttpSessionBindingListener保存進session中。
HttpSessionListener只需要設置到web.xml中就可以監聽整個應用中的所有session。HttpSessionBindingListener必須實例化后放入某一個session中,才可以進行監聽。
從監聽范圍上比較,HttpSessionListener設置一次就可以監聽所有session,HttpSessionBindingListener通常都是一對一的。
valueUnbound的觸發條件是以下三種情況:
(1)執行session.invalidate()時。
(2)session超時,自動銷毀時。
(3)執行session.setAttribute("onlineUserListener", "其他對象");或session.removeAttribute("onlineUserListener");將listener從session中刪除時。
因此,只要不將listener從session中刪除,就可以監聽到session的銷毀。
2.jsp調用
(1)login.jsp
- <%@?page?language= "java" ? import = "java.util.*" ?pageEncoding= "gbk" %> ??
- <%@?page? import = "com.logcd.listener.OnlineUserBindingListener" %> ??
- <% ??
- ????String?path?=?request.getContextPath(); ??
- ????String?basePath?=?request.getScheme()?+? "://" ??
- ????????????+?request.getServerName()?+? ":" ?+?request.getServerPort() ??
- ????????????+?path?+? "/" ; ??
- ????String?userId?=? "2000090603" ; ??
- ????String?userName?=? "LogCN" ; ??
- ????session.setAttribute(userId,userName); ??
- ????session.setAttribute( "onlineUserBindingListener" ,? new ?OnlineUserBindingListener(userId,userName)); ??
- ????response.sendRedirect( "counter.jsp" ); ??
- %>??
<%@ page language="java" import="java.util.*" pageEncoding="gbk"%> <%@ page import="com.logcd.listener.OnlineUserBindingListener"%> <% String path = request.getContextPath(); String basePath = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort() + path + "/"; String userId = "2000090603"; String userName = "LogCN"; session.setAttribute(userId,userName); session.setAttribute("onlineUserBindingListener", new OnlineUserBindingListener(userId,userName)); response.sendRedirect("counter.jsp"); %>
(2)counter.jsp
- <%@?page?language= "java" ? import = "java.util.*" ?pageEncoding= "gbk" %> ??
- 注冊用戶<span? class = "salient" ><%=((Map)application.getAttribute( "onlineUserList" )).size()%>?</span>?人??
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
