一、統(tǒng)計(jì)在線人數(shù)
1.監(jiān)聽(tīng)器
- 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); } }
說(shuō)明:實(shí)現(xiàn)了HttpSessionListener定義的兩個(gè)方法:sessionCreated()和sessionDestroyed()。這兩個(gè)方法可以監(jiān)聽(tīng)到當(dāng)前應(yīng)用中session的創(chuàng)建和銷毀情況。
以下兩種情況下就會(huì)發(fā)生sessionDestoryed(會(huì)話銷毀)事件:
(1)執(zhí)行session.invalidate()方法時(shí)。
(2)如果用戶長(zhǎng)時(shí)間沒(méi)有訪問(wèn)服務(wù)器,超過(guò)了會(huì)話最大超時(shí)時(shí)間,服務(wù)器就會(huì)自動(dòng)銷毀超時(shí)的session。
- < session-config > ??
- ???? < session-timeout > 1 </ session-timeout > ??
- </ session-config > ??
<session-config> <session-timeout>1</session-timeout> </session-config>
時(shí)間單位是一分鐘,并且只能是整數(shù),如果是零或負(fù)數(shù),那么會(huì)話就永遠(yuǎn)不會(huì)超時(shí)。
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調(diào)用
- 目前共有 < span ? class = "salient" > ? < %=application.getAttribute("numSessions")% > ? </ span > 人在線??
目前共有<span class="salient"> <%=application.getAttribute("numSessions")%> </span>人在線
二、統(tǒng)計(jì)注冊(cè)人數(shù)
1.監(jiān)聽(tīng)器
- 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; } }
說(shuō)明:實(shí)現(xiàn)了HttpSessionBindingListener接口,接口中共定義了兩個(gè)方法:valueBound()和valueUnbound(),分別對(duì)應(yīng)數(shù)據(jù)綁定,和取消綁定兩個(gè)事件。
所謂對(duì)session進(jìn)行數(shù)據(jù)綁定,就是調(diào)用session.setAttribute()把HttpSessionBindingListener保存進(jìn)session中。
HttpSessionListener只需要設(shè)置到web.xml中就可以監(jiān)聽(tīng)整個(gè)應(yīng)用中的所有session。HttpSessionBindingListener必須實(shí)例化后放入某一個(gè)session中,才可以進(jìn)行監(jiān)聽(tīng)。
從監(jiān)聽(tīng)范圍上比較,HttpSessionListener設(shè)置一次就可以監(jiān)聽(tīng)所有session,HttpSessionBindingListener通常都是一對(duì)一的。
valueUnbound的觸發(fā)條件是以下三種情況:
(1)執(zhí)行session.invalidate()時(shí)。
(2)session超時(shí),自動(dòng)銷毀時(shí)。
(3)執(zhí)行session.setAttribute("onlineUserListener", "其他對(duì)象");或session.removeAttribute("onlineUserListener");將listener從session中刪除時(shí)。
因此,只要不將listener從session中刪除,就可以監(jiān)聽(tīng)到session的銷毀。
2.jsp調(diào)用
(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" %> ??
- 注冊(cè)用戶<span? class = "salient" ><%=((Map)application.getAttribute( "onlineUserList" )).size()%>?</span>?人??
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

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