- 浏览: 108858 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
masuweng:
JAVA对数字证书的常用操作 -
beming:
org.springframework.beans.facto ...
利用Ant与Proguard混淆引用的子工程项目jar包及打war包 -
beming:
不错,挺清晰的
利用Ant与Proguard混淆引用的子工程项目jar包及打war包 -
sotired:
mark,看看
ExtJs2.0学习系列 - 索引贴
如何用Session实现在线统计的功能,其实只要对Servlet规范详细了解一下,明白其基本原理,编写一个类似的功能并不是一件很复杂的事情。这个例子是基于2.3以上的规范编写的,最主要功能就是提供在线用户列表显示(既然用户列表都可以显示了,那人数统计自然也不在话下了)。
在给出代码之前,先简单说一下监听器的常识。
HttpSessionListener:这是2.3以上规范所提供的一个新功能,也就是可以定义监听器监听HttpSession对象的创建和销毁。每当有新的用 户访问网站,应用服务器会创建一个HttpSession对象,每当Session超时,应用服务器则会销毁这个对象。
HttpSessionBindingListener:每当往Session中存入一个对象(setAttribute)或从Session中删除一个对象的时候,如果这个对象实现了此监听器接口,应用服务器将会自动调用接口相应的方法。
需要注意的一点就是,在sessionDestroyed方法和valueUnbound方法中,你可以得到HttpSession对象的实例,但是其getAttribute方法不再可用,也就是在这两个方法中,你不能再次得到存入session中的对象。
基于以上这些粗浅的认识,再简单介绍一下提供的测试例子的情况:
测试例子总共包含如下文件:
OnlineUserListener.java:它实现了HttpSessionListener接口
OnlineUsers.java:它包含了所有正在访问网站的用户信息,为了方便起见,它也实现了HttpSessionBindingListener接口(实际中你最好把他们分开吧)
User.java:这是用户的信息
test.jsp:为了方便,把登录,退出,显示在线用户列表等功能都做在同一个jsp文件里了。
下面是具体的代码:
test.jsp
在给出代码之前,先简单说一下监听器的常识。
HttpSessionListener:这是2.3以上规范所提供的一个新功能,也就是可以定义监听器监听HttpSession对象的创建和销毁。每当有新的用 户访问网站,应用服务器会创建一个HttpSession对象,每当Session超时,应用服务器则会销毁这个对象。
HttpSessionBindingListener:每当往Session中存入一个对象(setAttribute)或从Session中删除一个对象的时候,如果这个对象实现了此监听器接口,应用服务器将会自动调用接口相应的方法。
需要注意的一点就是,在sessionDestroyed方法和valueUnbound方法中,你可以得到HttpSession对象的实例,但是其getAttribute方法不再可用,也就是在这两个方法中,你不能再次得到存入session中的对象。
基于以上这些粗浅的认识,再简单介绍一下提供的测试例子的情况:
测试例子总共包含如下文件:
OnlineUserListener.java:它实现了HttpSessionListener接口
OnlineUsers.java:它包含了所有正在访问网站的用户信息,为了方便起见,它也实现了HttpSessionBindingListener接口(实际中你最好把他们分开吧)
User.java:这是用户的信息
test.jsp:为了方便,把登录,退出,显示在线用户列表等功能都做在同一个jsp文件里了。
下面是具体的代码:
/** *//**
* OnlineUserListener.java
* Created on 2004-11-19
*/
package com.ccctc.view.web;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;
/** *//**
* @author litf
*
*/
public class OnlineUserListener
implements HttpSessionListener {
/** *//**
* 浏览器第一次访问的时候,调用本方法
* @see javax.servlet.http.HttpSessionListener#sessionCreated(javax.servlet.http.HttpSessionEvent)
*/
public void sessionCreated(HttpSessionEvent event) {
User u = new User();
u.setName("guest");
u.setId(event.getSession().getId());
event.getSession().setAttribute("currentUser",u);
OnlineUsers.getInstance().addUser(u);
}
/** *//**
* Session超时的时候,调用本方法
* @see javax.servlet.http.HttpSessionListener#sessionDestroyed(javax.servlet.http.HttpSessionEvent)
*/
public void sessionDestroyed(HttpSessionEvent event) {
OnlineUsers.getInstance().removeUser(event.getSession().getId());
}
}
/** *//**
* OnlineUsers.java
* Created on 2004-11-19
*/
package com.ccctc.view.web;
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
import javax.servlet.http.HttpSession;
import javax.servlet.http.HttpSessionBindingEvent;
import javax.servlet.http.HttpSessionBindingListener;
/** *//**
* @author litf
* 在线用户统计
*/
public class OnlineUsers implements HttpSessionBindingListener{
private Map users = new HashMap();
private static OnlineUsers onlineUsers = new OnlineUsers();
public static OnlineUsers getInstance(){
return onlineUsers;
}
/** *//**
* @return
*/
public Collection getUsers() {
return users.values();
}
public void addUser(User user) {
users.put(user.getId(),user);
}
public void removeUser(String userId){
users.remove(userId);
}
/** *//**
* 对象实例(即OnlineUserListener的实例)作为一个属性被设置到session的
* 时候,会调用本方法,这种情况一般发生在点击登录按钮以后的处理过程中
* 设置
* @see javax.servlet.http.HttpSessionBindingListener#valueBound(javax.servlet.http.HttpSessionBindingEvent)
*/
public void valueBound(HttpSessionBindingEvent event) {
//现在暂时不需要额外处理,你可以在这里记录日志等
}
/** *//**
* 当Session超时,或本实例被从session中移除的时候被调用,这种情况一般
* 发生在注销方法的处理过程中
* @see javax.servlet.http.HttpSessionBindingListener#valueUnbound(javax.servlet.http.HttpSessionBindingEvent)
*/
public void valueUnbound(HttpSessionBindingEvent event) {
try {
HttpSession session = event.getSession();
User u = (User)session.getAttribute("currentUser");
u.setName("guest");
} catch (RuntimeException e) {
//e.printStackTrace();
}
}
}
/** *//**
* User.java
* Created on 2004-11-19
*/
package com.ccctc.view.web;
/** *//**
* @author litf
*
*/
public class User{
private String address;
private String id;
private String name;
/** *//**
* @see java.lang.Object#equals(java.lang.Object)
*/
public boolean equals(Object obj) {
if (obj == null || !(obj instanceof User)) {
return false;
}
if(this.id !=null && this.id.equals(((User)obj).getId())){
return true;
}
return false;
}
/** *//**
* @return
*/
public String getAddress() {
return address;
}
/** *//**
* @return
*/
public String getId() {
return id;
}
/** *//**
* @return
*/
public String getName() {
return name;
}
/** *//**
* @param string
*/
public void setAddress(String string) {
address = string;
}
/** *//**
* @param string
*/
public void setId(String string) {
id = string;
}
/** *//**
* @param string
*/
public void setName(String string) {
name = string;
}
/** *//**
* @see java.lang.Object#toString()
*/
public String toString() {
return "name:"+name + ",id:" + id + ",address:"+address;
}
}
* OnlineUserListener.java
* Created on 2004-11-19
*/
package com.ccctc.view.web;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;
/** *//**
* @author litf
*
*/
public class OnlineUserListener
implements HttpSessionListener {
/** *//**
* 浏览器第一次访问的时候,调用本方法
* @see javax.servlet.http.HttpSessionListener#sessionCreated(javax.servlet.http.HttpSessionEvent)
*/
public void sessionCreated(HttpSessionEvent event) {
User u = new User();
u.setName("guest");
u.setId(event.getSession().getId());
event.getSession().setAttribute("currentUser",u);
OnlineUsers.getInstance().addUser(u);
}
/** *//**
* Session超时的时候,调用本方法
* @see javax.servlet.http.HttpSessionListener#sessionDestroyed(javax.servlet.http.HttpSessionEvent)
*/
public void sessionDestroyed(HttpSessionEvent event) {
OnlineUsers.getInstance().removeUser(event.getSession().getId());
}
}
/** *//**
* OnlineUsers.java
* Created on 2004-11-19
*/
package com.ccctc.view.web;
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
import javax.servlet.http.HttpSession;
import javax.servlet.http.HttpSessionBindingEvent;
import javax.servlet.http.HttpSessionBindingListener;
/** *//**
* @author litf
* 在线用户统计
*/
public class OnlineUsers implements HttpSessionBindingListener{
private Map users = new HashMap();
private static OnlineUsers onlineUsers = new OnlineUsers();
public static OnlineUsers getInstance(){
return onlineUsers;
}
/** *//**
* @return
*/
public Collection getUsers() {
return users.values();
}
public void addUser(User user) {
users.put(user.getId(),user);
}
public void removeUser(String userId){
users.remove(userId);
}
/** *//**
* 对象实例(即OnlineUserListener的实例)作为一个属性被设置到session的
* 时候,会调用本方法,这种情况一般发生在点击登录按钮以后的处理过程中
* 设置
* @see javax.servlet.http.HttpSessionBindingListener#valueBound(javax.servlet.http.HttpSessionBindingEvent)
*/
public void valueBound(HttpSessionBindingEvent event) {
//现在暂时不需要额外处理,你可以在这里记录日志等
}
/** *//**
* 当Session超时,或本实例被从session中移除的时候被调用,这种情况一般
* 发生在注销方法的处理过程中
* @see javax.servlet.http.HttpSessionBindingListener#valueUnbound(javax.servlet.http.HttpSessionBindingEvent)
*/
public void valueUnbound(HttpSessionBindingEvent event) {
try {
HttpSession session = event.getSession();
User u = (User)session.getAttribute("currentUser");
u.setName("guest");
} catch (RuntimeException e) {
//e.printStackTrace();
}
}
}
/** *//**
* User.java
* Created on 2004-11-19
*/
package com.ccctc.view.web;
/** *//**
* @author litf
*
*/
public class User{
private String address;
private String id;
private String name;
/** *//**
* @see java.lang.Object#equals(java.lang.Object)
*/
public boolean equals(Object obj) {
if (obj == null || !(obj instanceof User)) {
return false;
}
if(this.id !=null && this.id.equals(((User)obj).getId())){
return true;
}
return false;
}
/** *//**
* @return
*/
public String getAddress() {
return address;
}
/** *//**
* @return
*/
public String getId() {
return id;
}
/** *//**
* @return
*/
public String getName() {
return name;
}
/** *//**
* @param string
*/
public void setAddress(String string) {
address = string;
}
/** *//**
* @param string
*/
public void setId(String string) {
id = string;
}
/** *//**
* @param string
*/
public void setName(String string) {
name = string;
}
/** *//**
* @see java.lang.Object#toString()
*/
public String toString() {
return "name:"+name + ",id:" + id + ",address:"+address;
}
}
test.jsp
<%@ page import="com.ccctc.view.web.*" %>
<%
User u = (User)session.getAttribute("currentUser");
String name = request.getParameter("user");
if(u != null){
String remote = request.getRemoteAddr();
u.setAddress(remote);
}
//User Login
if(name != null){
if(u != null){
session.setAttribute("_listener",OnlineUsers.getInstance());
u.setName(name);
}
}
//User Logout
String logout = request.getParameter("logout");
if(logout != null){
session.removeAttribute("_listener");
}
%>
current users:<p>
<%
java.util.Collection l = OnlineUsers.getInstance().getUsers();
for(java.util.Iterator it = l.iterator(); it.hasNext();)
{
User tu = (User)it.next();
if(u.equals(tu))
{
%>
../../Images/OutliningIndicators/In
<%
User u = (User)session.getAttribute("currentUser");
String name = request.getParameter("user");
if(u != null){
String remote = request.getRemoteAddr();
u.setAddress(remote);
}
//User Login
if(name != null){
if(u != null){
session.setAttribute("_listener",OnlineUsers.getInstance());
u.setName(name);
}
}
//User Logout
String logout = request.getParameter("logout");
if(logout != null){
session.removeAttribute("_listener");
}
%>
current users:<p>
<%
java.util.Collection l = OnlineUsers.getInstance().getUsers();
for(java.util.Iterator it = l.iterator(); it.hasNext();)
{
User tu = (User)it.next();
if(u.equals(tu))
{
%>
../../Images/OutliningIndicators/In
发表评论
-
分享J2EE学习的20个网站
2009-11-10 11:07 1058前人栽树,后人乘凉。 ... -
struts2标签集
2009-11-12 11:38 541A: <s:a xhref="" ... -
struts2标签使用 (#$%)/js命名空间
2009-11-13 14:49 775session中存有UserVO值对象,其中有networkL ... -
Struts2使用之值栈与OGNL-使用
2009-11-25 16:47 998Struts2使用之值栈与OGNL-使用 ... -
jQuery+struts+json
2009-12-09 12:10 820在struts中采用jquery利用json数据来动态无刷新更 ... -
提高JAVA代码质量,减少代码缺陷
2009-12-09 14:10 1045这是最新一期IBM developworks的专题,摘录了一些 ... -
struts2.0标签应用–for循环的实现
2009-12-30 15:01 819<!--header.php end--> & ... -
JSP防止重复提交,重复刷新,后退
2010-01-06 12:24 1296一。前言 你在任何一个 ... -
struts2:利用标签显示List嵌套Map
2010-02-01 17:12 1125List中存放一个Map,利用<s:iterator/& ... -
REFERER及jsp中request.getHeader() 相关详细
2010-02-23 17:42 932在三种情况下,<%=request.getHeader( ... -
Ubuntu下安装和配置Apache2
2010-03-05 10:15 992在Ubuntu中安装apache 安装 ... -
Struts2的Result Type
2010-03-07 15:46 0chain 用来处理Act<wbr> ... -
Java读写cookie
2010-04-02 09:51 751<!--<br><br> ... -
JSP容器的初始化和销毁 - ServletContext(转)
2010-04-20 10:19 1291ServletContext 被 Servlet 程序用来与 ... -
快速建立Subversion服务器
2010-05-20 16:19 705如何快速建立Subversion服务器,并且在项目中 ... -
Apache安装设置 - Ubuntu中文
2010-06-24 15:39 753Apache 安装设 ... -
Log4J使用完全手册(转)
2010-07-14 22:08 787Log4J是Apache的一个开放源代码项目(http:// ...
相关推荐
在JavaWeb开发中,"用session统计在线人数"是一个常见的需求,主要应用于网站或应用的实时用户活动监控。本文将详细解析如何利用session这一核心技术来实现这个功能。 首先,理解session的基本概念。在Web开发中,...
"简单测试,session统计上线人数demo" 描述了这个压缩包内的内容是一份简单的示例代码,用于进行测试,目的是向开发者展示如何在Java应用中实现一个基础的在线人数计数功能。它可能包含一个基本的计数器,每次新的...
在本主题“day18 监听器”中,我们将探讨如何利用监听器来统计在线人数、定时销毁超时session、实现session的钝化与活化,以及如何在系统中显示在线用户列表和实现踢人功能,从而防止用户自动登录。同时,还会涉及...
本主题将深入探讨如何进行session初始化、实现网站流量统计以及监控在线人数,这些都是Web应用开发中的重要环节。 首先,让我们了解什么是Session。在Servlet环境中,每当用户打开一个新的会话(比如首次访问网页)...
在Java Web开发中,我们可以使用Servlet API中的Session监听器来实现这一功能。Session监听器是实现了`javax.servlet.http.HttpSessionListener`接口的类,它可以监听到Session的创建和销毁事件,从而判断用户的登录...
以上就是使用JSP实现在线人数统计的基本方法和关键点,具体实现可能需要根据项目需求和环境进行调整。在实际开发中,还要考虑到性能、可扩展性和用户体验等因素,确保统计的准确性和系统的稳定性。
2. **统计在线用户**:维护一个全局计数器,每当有新的Session创建,计数器加一,Session销毁时减一,从而得到当前在线用户数量。 3. **Session有效期管理**:根据业务需求,可以在监听到Session即将过期时提醒用户...
1. 统计在线用户:通过监听Session的创建和销毁,可以统计网站的实时在线用户数量。 2. 用户行为分析:记录用户Session的活跃时间、访问路径等,用于分析用户行为。 3. 资源管理:在Session销毁时释放占用的资源,...
以上就是通过`HttpSessionListener`统计在线人数的基本原理和实现步骤。在实际应用中,你可能还需要根据项目需求进行相应的调整和优化,比如增加日志记录、异常处理等。项目中的`SessionListener`类应该包含了实现...
总结,Java Web在线人数统计通过监听Session生命周期,结合适当的存储和显示机制,可以实现高效且实时的在线用户数量统计。理解这一机制对于提升Web应用的用户体验和优化服务器资源管理至关重要。
在Spring Boot框架中,统计在线用户数是一个常见需求,尤其是在Web应用中。一个典型的解决方案是使用...这样,我们就可以通过访问ServletContext来获取当前在线用户数,从而实现在线人数的统计功能。
本示例"SessionManager:Java监听器实现在线人数统计Demo"将演示如何利用Java的Servlet监听器来实现这一功能。以下是详细的步骤和相关知识点。 首先,我们需要了解Java Servlet监听器的概念。Servlet监听器是Java ...
Java Web的监听器机制是增强应用程序功能的强大工具,通过`ServletContextListener`、`HttpSessionListener`和`HttpSessionAttributeListener`,我们可以实现对Web应用程序上下文、HttpSession以及session属性的监听...
它们在控制器方法调用之前和之后执行,可用于实现诸如权限检查、日志记录、性能统计等功能。定义一个拦截器需要继承`HandlerInterceptor`接口或实现`HandlerInterceptorAdapter`抽象类,并重写`preHandle()`, `...
本文将深入探讨如何使用JSP(JavaServer Pages)和Servlet结合Java的session技术来实现这一功能。 首先,理解session的概念是至关重要的。在Web应用中,session是一种服务器端存储用户状态的方法。当用户登录网站后...
在实现统计在线人数的功能时,需要实现以下功能: 1. 当用户登录时(即会话创建时),记录在线人数加一,并将当前的用户信息(包括sessionID、IP地址和第一次登录时间)存储起来。这通常需要实现...
本主题将详细介绍如何使用Java编程语言来实现这一功能,特别是关注当前年、月、日的访问量统计。 首先,我们需要理解基本的统计原理。网站访问量通常通过记录每个独立访客的请求来计算。在线人数则是指在特定时间...
本文将详细介绍如何在JSP(JavaServer Pages)环境中实现在线人数统计的功能。此功能主要依赖于J2EE平台提供的`HttpSession`机制以及`HttpSessionListener`监听器来完成。 #### 二、背景知识 1. **JSP与Servlet**...
Session监听能够帮助开发者追踪用户会话的状态变化,对于实现诸如在线用户统计、用户状态跟踪等功能非常有用。根据给定的信息,本文将详细介绍session监听以及attribute监听的相关知识点。 ### Session监听详解 ##...