DZM.528
Life is a voyage, not a destination.
用Session实现在线统计的功能(HttpSessionListener)
如何用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文件里了。
下面是具体的代码:
/** */
/**
* 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))
{
%>
<
font color
=
red
><%=
tu.getName()
%>
:
<%=
tu.getAddress()
%>
</
font
>
<%
}
else
{
%>
<%=
tu.getName()
%>
:
<%=
tu.getAddress()
%>
<%
}
}
%>
<
form action
=
"
/cctc/login.jsp
"
>
User :
<
input name
=
"
user
"
type
=
"
text
"
>
<
br
>
<
input type
=
"
submit
"
name
=
"
Submit
"
>
</
form
>
<
p
>
<
a href
=
"
/cctc/login.jsp?logout=true
"
>
Logout
</
a
>
<
p
>
<
a href
=
"
/cctc/login.jsp
"
>
refresh
</
a
>
web.xml文件中增加:
<
listener
>
<
listener
-
class
>
com.ccctc.view.web.OnlineUserListener
</
listener
-
class
>
</
listener
>
发表于 2010-01-18 16:52
DZM.528
阅读(1095)
评论(0)
编辑
收藏
所属分类:
JavaEE
新用户注册
刷新评论列表
只有注册用户
登录
后才能发表评论。
网站导航:
博客园
IT新闻
Chat2DB
C++博客
博问
管理
相关文章:
Log4J使用完全手册(转)
Apache安装设置 - Ubuntu中文
快速建立Subversion服务器
JSP容器的初始化和销毁 - ServletContext(转)
Java读写cookie
Ubuntu下安装和配置Apache2
struts2:利用标签显示List嵌套Map
用Session实现在线统计的功能(HttpSessionListener)
JSP防止重复提交,重复刷新,后退
struts2.0标签应用–for循环的实现
<
2010年1月
>
日
一
二
三
四
五
六
27
28
29
30
31
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
1
2
3
4
5
6
导航
BlogJava
首页
发新随笔
发新文章
聚合
管理
统计
随笔: 92
文章: 0
评论: 18
引用: 0
随笔分类
(70)
IDE/Tools(9)
(rss)
IM(7)
(rss)
Java Security(5)
(rss)
JavaEE(16)
(rss)
JS/jQuery(12)
(rss)
Linux(10)
(rss)
XHtml/CSS(3)
(rss)
人生规划(2)
(rss)
性能测试(2)
(rss)
数据库(2)
(rss)
网络编程(2)
(rss)
收藏夹
(4)
JavaSE学习系列(4)
(rss)
左邻右舍
1-2-3.cnblogs
DANCE WITH JAVA
downpour博客
fangang
java加密解密/压缩
Ken Wu`s Blog
Max On Java
Openfire研究小组
robbin的自言自语
zwt2001267
不朽的飞翔
大鹏的工作笔记
缪小东博客
股海e程
都市淘沙者
我的链接
Apache Mina学习
apache2 安装与配置
blogjava-google搜索
Core Java学习
Dom4j 学习笔记
Epoch Converter
Hibernate annotations reference[zh_cn]
httpclient入门
IBM's developerWorks 中国
Java1.5泛型指南
java开源大全
Java性能优化技巧集锦
Java数字证书实例
java知识点
Java程序员应该好好看看的书籍
Java编程实现支持中文的Base64编码转换
Java网络编程从入门到精通
Java网络编程-清华java教程笔记
jQuery api
jQuery1.1 API 中文版
jQuery中文社区
jQuery官方网站
Js-FAQ贴
jsonlint-测验json
json介绍
Maven权威指南
PostgreSQL 8.0.0 中文文档
struts2.0系列
thickbox-对话框插件
Ubuntu中文
亚当学院
基于 SSH 的远程操作以及安全,快捷的数据传输
播布客
满江红-RedsagaTeam
精通JS正则表达式
最新评论
1. re: 用Keytool和OpenSSL生成和签发数字证书
@wyh
index.txt删掉再新建一个就可以了
--silence.lc
2. rewq
但是而且我日
--黄山
3. re: Ubuntu下安装和配置Apache2
受益!
--王老五
4. re: JSP防止重复提交,重复刷新,后退
顶顶顶
--搜索
5. re: JSP防止重复提交,重复刷新,后退
sss
--搜索
阅读排行榜
1. Ubuntu下安装和配置Apache2(65513)
2. 用Keytool和OpenSSL生成和签发数字证书(12928)
3. Ubuntu中安装Chrome小记[解决 错误:依赖关系没有满足:libnss3-1d (>= 3.12.3)](12325)
4. REFERER及jsp中request.getHeader() 相关详细(11720)
5. Tsung安装与使用(7286)