`
hz_chenwenbiao
  • 浏览: 1010321 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

HttpSessionBindingListener获取在线用户数(转)

阅读更多

 

 

下面为我的测试例子,首先建个web工程,例子中程序包括:OnLineUser.java  ,login.jsp ,logout.jsp,onLineUser.jsp,closePage.jsp五个文件:

 

1 OnLineUser.java

package org.lab24.servlet;

/**//*
 * onLineUser类实现HttpSessionBindingListener接口
 * onLineUser类将具有HttpSessionBindingListener接口的特有属性
 * 那么HttpSessionBindingListener接口的特有属性是什么呢?
 * HttpSessionBindingListener接口具有的两个空函数
 * public void valueBound(HttpSessionBindingEvent e)
 * public void valueUnBound(HttpSessionBindingEvent e)
 * 
 * onLineUser实现一些方法:获取在线用户数
 * 
 */

import javax.servlet.http.*;
import java.util.*;

public class OnLineUser implements HttpSessionBindingListener {

	public OnLineUser() {
	}

	private Vector users = new Vector();

	public int getCount() {
		users.trimToSize();// 调整Vector users的容量为Vector users的大小
		return users.capacity();// 返回users的容量
	}

	public boolean existUser(String userName) {
		users.trimToSize();
		boolean existUser = false;
		for (int i = 0; i < users.capacity(); i++) {
			if (userName.equals((String) users.get(i))) {
				existUser = true;
				break;
			}
		}
		return existUser;
	}

	public boolean deleteUser(String userName) {
		
		users.trimToSize();
		if (existUser(userName)) {
			int currUserIndex = -1;
			for (int i = 0; i < users.capacity(); i++) {
				if (userName.equals((String) users.get(i))) {
					currUserIndex = i;
					break;
				}
			}
			if (currUserIndex != -1) {
				users.remove(currUserIndex);
				users.trimToSize();
				return true;
			}
		}
		return false;
	}

	public Vector getOnLineUser() {
		return users;
	}

	public void valueBound(HttpSessionBindingEvent e) {
		users.trimToSize();
		System.out.println("请求:::::::::::" + e.getName());
		if (!existUser(e.getName())) {
			users.add(e.getName());
			System.out.print(e.getName() + "    登入到系统 " + (new Date()));
			System.out.println("      在线用户数为:" + getCount());
		} else {
			System.out.println(e.getName() + "已经存在");
		}
	}

	public void valueUnbound(HttpSessionBindingEvent e) {
		users.trimToSize();
		String userName = e.getName();
		deleteUser(userName);
		System.out.print(userName + "    退出系统 " + (new Date()));
		System.out.println("      在线用户数为:" + getCount());
	}

}
 

 

2 login.jsp

 

<%@ page contentType="text/html;charset=gb2312"%>
<html>
	<head>
		<title>测试HttpSessionBindingListener接口</title>
		
		<script type="text/javascript">
			function check(){
				var userName = document.getElementById("userID").value;
				if("userName".equals(userName))
					return false;
				alert(userName);
				return true;
			}
		</script>
		
	</head>

	<body>
		<!-- 这里要注意的是这里使用了get的方式,因为这里没有使用spring mvc或struts来中转处理,所以在js获取请求的参数的时候较困难,所以这里设置为get方式 -->	
		<form name="login" method="get" action="onLineUser.jsp">
			<input type=text name="username" id="userID">
			<script type="text/javascript">
				document.getElementById("userID").focus();//期望的元素一出现,即定位焦点
			</script>
			
			<input type=submit name="submit" value="登陆" onClick="check()">
		</form>
	</body>
</html>
  

3 onLineUser.jsp

 

<%@ page contentType="text/html;charset=gb2312"%>
<%@page import="java.util.*,org.lab24.servlet.*"%>
<%@page import="javax.servlet.http.*"%>
<jsp:useBean id="onlineuser" class="org.lab24.servlet.OnLineUser" scope="application" />
<html>
	<head>
		<title>搞定JSP在线人数</title>
		
		<%
			String username = request.getParameter("username");
		%>
		
		<script type="text/javascript">

		var userName = "";

		window.onload = function(){
			userName=getQueryParameter("username");
		}
	

		//获取指定参数名的参数值
		function getQueryParameter(qs)
		{
		    var s = location.href;
		    s = s.replace("?","?&").split("&");//这样可以保证第一个参数也能分出来
		    var re = "";
		    for(i=1;i<s.length;i++)
		        if(s[i].indexOf(qs+"=")==0)
		            re = s[i].replace(qs+"=","");//取代前面的参数名,只剩下参数值
		            
		    return re;
		}

		
		window.onbeforeunload=function(){
			var myurl = "closePage.jsp?username="+ userName;
			window.open(myurl,"_blank"); 
		}

		</script>
	</head>
	<body>
		<center>
			<h1>
				登陆成功,欢迎您访问!
			</h1>
		</center>
		<%
			session = request.getSession(false);
		%>
		<%
			
			if (onlineuser.existUser(username)) {
				out.println("用户<font color=red>" + username + "</font>已经登陆!");
			} 
			else {
				session.setMaxInactiveInterval(600);//Sesion有效时长,以秒为单位
				session.setAttribute(session.getId(),username);//这个是为了关闭用户页面里跳转到BeforeClosePage这个servlet而设置的,这个不能用request来设置它的值,request应该是页面到页面才有效的,跳到server那边再处理好像就没效了
				session.setAttribute(username, onlineuser);//这个应该是将用户加入HttpSessionBindingListener管理,就也是触发onlineuser这个listener的valueBound方法,username作业参数传进去
				out.println("欢迎新用户:<font color=red>" + username
						+ "</font>登陆到系统!");
			}
			out.println("<br>当前在线用户人数:<font color=red>" + onlineuser.getCount()
					+ "</font><br>");
			Vector vt = onlineuser.getOnLineUser();
			Enumeration e = vt.elements();
			out.println("在线用户列表");
			out.println("<table border=1>");
			out.println("<tr><td>用户名</td></tr>");
			/*while(e.hasMoreElements()){
			    out.println("<tr><td>");
			    out.println((String)e.nextElement()+"<br>");
			    out.println("</td></tr>");
			}
			下面的方法也是可以的,这两种方法都是可行的,其实Iterator是Enumeration的子类
			 */
			for (Iterator it = vt.iterator(); it.hasNext();) {
				out.println("<tr><td>");
				out.println((String) it.next() + "<br>");
				out.println("</td></tr>");
			}
			out.println("</table>");
		%>
		<center>
			<p>
				elapsed制作
			</p>
			<p>
			</p>
			<%
				out.println("<p><a href=''logout.jsp?username=" + username
						+ "''>退出系统</a></p>");
			%>
		</center>
	</body>
</html>
 

 

 

4 logout.jsp

 

<%@ page contentType="text/html;charset=gb2312"%>
<%@ page import="org.lab24.servlet.OnLineUser,java.util.*"%>
<jsp:useBean id="onlineuser" class="org.lab24.servlet.OnLineUser"
	scope="application" />
<html>
	<head>
		<title>搞定JSP在线人数</title>
	</head>
	<body>
		<center>
			<h1>
				欢迎您访问!
			</h1>
		</center>
		<%
			String username = request.getParameter("username");
			if (username != null && onlineuser.deleteUser(username)) {
				out.println(username + "已经退出系统!");
				session.removeAttribute(username);
				out.println("<script>window.location=\"login.jsp\";</script>");
			} else {
				out.println(username + "已经退出系统!");
				out.println("<script>window.location=\"login.jsp\";</script>");
			}
		%>
		<center>
			<p>
				elapsed制作
			</p>
			<p>
			</p>
			<p>
				<a href="logout.jsp">退出系统</a>
			</p>
		</center>
	</body>
</html>
  

5 closePage.jsp

 

<%@ page contentType="text/html;charset=gb2312"%>
<%@page import="javax.servlet.http.*"%>
<jsp:useBean id="onlineuser" class="org.lab24.servlet.OnLineUser"
	scope="application" />

<%
	//下面的方式会把所的用户赶下线,这个可以是由于没指定一个用户名给valueUnbound方法,所以当使用invalidate方法时,会将所有的用户都赶下线了
	//HttpSession session2 = request.getSession(false);//变量名要是最为session会抛异常的。
	//HttpSession session = request.getSession();
	//session2.invalidate();

	String username = request.getParameter("username");
	if (username != null && onlineuser.deleteUser(username)) {
		out.println(username + "已经退出系统!");
		session.removeAttribute(username);
		out.println("<script>window.location=\"login.jsp\";</script>");
	} else {
		out.println(username + "已经退出系统!");
		out.println("<script>window.location=\"login.jsp\";</script>");
	}
%>
  

6 web.xml

 

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
	http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">

	<listener>
		<listener-class>org.lab24.servlet.OnLineUser</listener-class>
	</listener>

	<welcome-file-list>
		<welcome-file>index.jsp</welcome-file>
	</welcome-file-list>
</web-app>
 

 

还可以参照一下这篇文章:

 

使用HttpSessionBindingListener 方法http://yufenfei.iteye.com/blog/439050

分享到:
评论

相关推荐

    HttpSessionBindingListener实现在线人员查看即人数统计

    通过上述方式,`HttpSessionBindingListener`可以帮助我们实现对在线用户的精确监控和统计。同时,它还能用于其他场景,比如缓存管理、个性化数据跟踪等。理解并熟练运用这个接口,能够提升Java Web应用的功能性和...

    基于HttpSessionBindingListener的登陆日志

    在Java Web开发中,HttpSessionBindingListener是一个重要的接口,用于监听HttpSession中的绑定和解绑事件。在本例中,我们将使用HttpSessionBindingListener来记录登陆者的用户名和登录时间到数据库中。 首先,让...

    jsp 统计在线人数利用HttpSessionListener、HttpSessionBindingListener

    jsp 统计在线人数实例,是个完整的项目实例,部署即可查看效果! 通过使用:HttpSessionListener、HttpSessionBindingListener来实现. valueBound 方法登录触发。 valueUnbound 方法退出触发。

    HttpSessionListener 和HttpSessionBindingListener的区别 单点登录

    - 使用`HttpSessionListener`可以监控用户登录状态的变化,及时更新在线用户列表,从而确保各个子系统之间共享正确的用户状态信息。 - 通过`HttpSessionBindingListener`可以在用户登录时绑定必要的认证信息至会话中...

    Spring+Struts2+ibatis 异地登录 HttpSessionBindingListener

    我们可以自定义一个拦截器,检查每次请求的session状态,如果发现有异地登录的情况,就触发`HttpSessionBindingListener`的相关方法,通知用户已注销当前设备的登录状态。 iBatis作为持久层框架,主要用于数据库...

    JSP统计在线人数实现

    - `valueBound(HttpSessionBindingEvent e)` 当用户登录时被调用,将用户名添加到`users`向量并更新在线用户数。 - `valueUnbound(HttpSessionBindingEvent e)` 当用户注销时被调用,从`users`向量中移除用户名并...

    javaweb开发在线人数统计

    这个功能的完成,主要是利用一个实现了 HttpSessionBindingListener 接口的对象,当这个对象被绑定到 Session 中或者从 Session 中被删除时,更新当前在线的用户名单。 在本例子中,我们使用 Java 语言和 ...

    JSP中基于Session的在线用户统计分析

    在JSP中获取当前所有在线用户列表时,Servlet API并未提供直接获取Session列表的方法。此时,可以利用Servlet监听器(Listener)来实现这一功能。在Servlet 2.2中,我们可以使用`HttpSessionBindingListener`接口,...

    基于ServletJSP的部门管理系统.zip

    基于ServletJSP的部门管理系统 项目简介 本项目是一个基于Servlet和JSP技术的部门管理系统,主要... 通过HttpSessionBindingListener接口监听用户会话的绑定和解除绑定事件,实时更新在线用户数量。 3. 部门管理

    源码:程序开发中,经常需要对某些事件进行监听,比如一一个网站页面可能要动态监听当前在线用户有 哪些以及在线总人数

    程序开发中,经常需要对某些事件进行监听,比如一一个网站页面可能要动态监听当前在线用户有 哪些以及在线总人数,这个就可以使用到Servlet进行监听用户的登陆退出。 3、需求分析 程序开发中,经常需要对某些事件...

    jsp完成对在线人数的统计!

    为了实时获取用户的在线状态,项目中采用了`HttpSessionBindingListener`接口。当用户登录时,该接口会被用来监听会话绑定事件,从而记录用户登录信息;当用户注销或会话超时时,监听器则会触发会话解除绑定事件,...

    用JSP程序实现统计当前在线人数

    4. **获取在线用户列表**:`getOnLineUser()`方法返回当前所有在线用户的列表。 ### HttpSessionBindingListener的作用 `HttpSessionBindingListener`接口提供两个回调方法:`valueBound()`和`valueUnbound()`。当...

    在线人数统计

    - 在`result.jsp`中,我们获取`application`对象中的在线用户列表,并遍历它,将每个在线用户显示在表格中。 5. **注销流程**: - 用户点击注销链接,跳转到`logout.jsp`。 - 在`logout.jsp`中,我们从session...

    jsp统计在线人数.txt

    - `public Vector getOnLineUser()`: 获取所有在线用户的列表。 - `public void valueBound(HttpSessionBindingEvent e)`: 当一个对象被绑定到会话时调用此方法。 - `public void valueUnbound...

    javax.servlet.http使用帮助.docx

    - **getDateHeader(String name)**:获取指定请求头域的值,并将其转换为自 1970 年 1 月 1 日 GMT 以来的毫秒数。 - **getHeader(String name)**:获取指定请求头域的值。 - **getHeaderNames()**:获取所有请求...

    Servlet技术(事件监听器-在线踢人).zip

    这通常涉及到数据库查询以获取用户的会话ID,然后在服务器端进行操作。同时,可能还需要更新用户的状态信息,防止用户在被踢出后立即重新登录。 总结来说,这个压缩包提供的示例涵盖了Servlet技术中的事件监听器和...

    servlet 监听器范例

    在这个范例中,我们将深入探讨如何利用监听器来统计在线人员数量以及处理用户登录事件。 首先,我们需要了解Servlet监听器的基本概念。Servlet监听器是实现了特定接口的Java类,这些接口定义了针对不同Web应用程序...

    监听器显示登陆用户列表,并实现踢人功能

    通过实现这个接口,我们可以获取到用户的登录状态和相关信息,进而实现一些高级功能,如监控在线用户或执行特定操作。 要创建一个`HttpSessionAttributeListener`,首先我们需要定义一个类并实现其方法: ```java ...

Global site tag (gtag.js) - Google Analytics