- 浏览: 106802 次
- 性别:
- 来自: 北京
-
文章分类
最新评论
-
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文件里了。
下面是具体的代码:
![](../../Images/OutliningIndicators/ExpandedBlockStart.gif)
/** *//**
* OnlineUserListener.java
* Created on 2004-11-19
*/
package com.ccctc.view.web;
![](../../Images/OutliningIndicators/None.gif)
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;
![](../../Images/OutliningIndicators/None.gif)
![](../../Images/OutliningIndicators/ExpandedBlockStart.gif)
/** *//**
* @author litf
*
*/
public class OnlineUserListener
![](../../Images/OutliningIndicators/ExpandedBlockStart.gif)
implements HttpSessionListener
{
![](../../Images/OutliningIndicators/InBlock.gif)
![](../../Images/OutliningIndicators/ExpandedSubBlockStart.gif)
/** *//**
* 浏览器第一次访问的时候,调用本方法
* @see javax.servlet.http.HttpSessionListener#sessionCreated(javax.servlet.http.HttpSessionEvent)
*/
![](../../Images/OutliningIndicators/ExpandedSubBlockStart.gif)
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);
}
![](../../Images/OutliningIndicators/InBlock.gif)
![](../../Images/OutliningIndicators/ExpandedSubBlockStart.gif)
/** *//**
* Session超时的时候,调用本方法
* @see javax.servlet.http.HttpSessionListener#sessionDestroyed(javax.servlet.http.HttpSessionEvent)
*/
![](../../Images/OutliningIndicators/ExpandedSubBlockStart.gif)
public void sessionDestroyed(HttpSessionEvent event)
{
OnlineUsers.getInstance().removeUser(event.getSession().getId());
}
![](../../Images/OutliningIndicators/InBlock.gif)
}
![](../../Images/OutliningIndicators/None.gif)
![](../../Images/OutliningIndicators/None.gif)
![](../../Images/OutliningIndicators/ExpandedBlockStart.gif)
/** *//**
* OnlineUsers.java
* Created on 2004-11-19
*/
package com.ccctc.view.web;
![](../../Images/OutliningIndicators/None.gif)
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
![](../../Images/OutliningIndicators/None.gif)
import javax.servlet.http.HttpSession;
import javax.servlet.http.HttpSessionBindingEvent;
import javax.servlet.http.HttpSessionBindingListener;
![](../../Images/OutliningIndicators/None.gif)
![](../../Images/OutliningIndicators/ExpandedBlockStart.gif)
/** *//**
* @author litf
* 在线用户统计
*/
![](../../Images/OutliningIndicators/ExpandedBlockStart.gif)
public class OnlineUsers implements HttpSessionBindingListener
{
![](../../Images/OutliningIndicators/InBlock.gif)
private Map users = new HashMap();
private static OnlineUsers onlineUsers = new OnlineUsers();
![](../../Images/OutliningIndicators/ExpandedSubBlockStart.gif)
public static OnlineUsers getInstance()
{
return onlineUsers;
}
![](../../Images/OutliningIndicators/ExpandedSubBlockStart.gif)
/** *//**
* @return
*/
![](../../Images/OutliningIndicators/ExpandedSubBlockStart.gif)
public Collection getUsers()
{
return users.values();
}
![](../../Images/OutliningIndicators/ExpandedSubBlockStart.gif)
public void addUser(User user)
{
users.put(user.getId(),user);
}
![](../../Images/OutliningIndicators/ExpandedSubBlockStart.gif)
public void removeUser(String userId)
{
users.remove(userId);
}
![](../../Images/OutliningIndicators/ExpandedSubBlockStart.gif)
/** *//**
* 对象实例(即OnlineUserListener的实例)作为一个属性被设置到session的
* 时候,会调用本方法,这种情况一般发生在点击登录按钮以后的处理过程中
* 设置
* @see javax.servlet.http.HttpSessionBindingListener#valueBound(javax.servlet.http.HttpSessionBindingEvent)
*/
![](../../Images/OutliningIndicators/ExpandedSubBlockStart.gif)
public void valueBound(HttpSessionBindingEvent event)
{
//现在暂时不需要额外处理,你可以在这里记录日志等
}
![](../../Images/OutliningIndicators/InBlock.gif)
![](../../Images/OutliningIndicators/ExpandedSubBlockStart.gif)
/** *//**
* 当Session超时,或本实例被从session中移除的时候被调用,这种情况一般
* 发生在注销方法的处理过程中
* @see javax.servlet.http.HttpSessionBindingListener#valueUnbound(javax.servlet.http.HttpSessionBindingEvent)
*/
![](../../Images/OutliningIndicators/ExpandedSubBlockStart.gif)
public void valueUnbound(HttpSessionBindingEvent event)
{
![](../../Images/OutliningIndicators/ExpandedSubBlockStart.gif)
try
{
HttpSession session = event.getSession();
User u = (User)session.getAttribute("currentUser");
u.setName("guest");
![](../../Images/OutliningIndicators/ExpandedSubBlockStart.gif)
} catch (RuntimeException e)
{
//e.printStackTrace();
}
}
![](../../Images/OutliningIndicators/InBlock.gif)
}
![](../../Images/OutliningIndicators/None.gif)
![](../../Images/OutliningIndicators/None.gif)
![](../../Images/OutliningIndicators/ExpandedBlockStart.gif)
/** *//**
* User.java
* Created on 2004-11-19
*/
package com.ccctc.view.web;
![](../../Images/OutliningIndicators/None.gif)
![](../../Images/OutliningIndicators/ExpandedBlockStart.gif)
/** *//**
* @author litf
*
*/
![](../../Images/OutliningIndicators/ExpandedBlockStart.gif)
public class User
{
private String address;
private String id;
private String name;
![](../../Images/OutliningIndicators/InBlock.gif)
![](../../Images/OutliningIndicators/ExpandedSubBlockStart.gif)
/** *//**
* @see java.lang.Object#equals(java.lang.Object)
*/
![](../../Images/OutliningIndicators/ExpandedSubBlockStart.gif)
public boolean equals(Object obj)
{
![](../../Images/OutliningIndicators/ExpandedSubBlockStart.gif)
if (obj == null || !(obj instanceof User))
{
return false;
}
![](../../Images/OutliningIndicators/ExpandedSubBlockStart.gif)
if(this.id !=null && this.id.equals(((User)obj).getId()))
{
return true;
}
return false;
}
![](../../Images/OutliningIndicators/InBlock.gif)
![](../../Images/OutliningIndicators/ExpandedSubBlockStart.gif)
/** *//**
* @return
*/
![](../../Images/OutliningIndicators/ExpandedSubBlockStart.gif)
public String getAddress()
{
return address;
}
![](../../Images/OutliningIndicators/InBlock.gif)
![](../../Images/OutliningIndicators/ExpandedSubBlockStart.gif)
/** *//**
* @return
*/
![](../../Images/OutliningIndicators/ExpandedSubBlockStart.gif)
public String getId()
{
return id;
}
![](../../Images/OutliningIndicators/InBlock.gif)
![](../../Images/OutliningIndicators/ExpandedSubBlockStart.gif)
/** *//**
* @return
*/
![](../../Images/OutliningIndicators/ExpandedSubBlockStart.gif)
public String getName()
{
return name;
}
![](../../Images/OutliningIndicators/InBlock.gif)
![](../../Images/OutliningIndicators/ExpandedSubBlockStart.gif)
/** *//**
* @param string
*/
![](../../Images/OutliningIndicators/ExpandedSubBlockStart.gif)
public void setAddress(String string)
{
address = string;
}
![](../../Images/OutliningIndicators/InBlock.gif)
![](../../Images/OutliningIndicators/ExpandedSubBlockStart.gif)
/** *//**
* @param string
*/
![](../../Images/OutliningIndicators/ExpandedSubBlockStart.gif)
public void setId(String string)
{
id = string;
}
![](../../Images/OutliningIndicators/InBlock.gif)
![](../../Images/OutliningIndicators/ExpandedSubBlockStart.gif)
/** *//**
* @param string
*/
![](../../Images/OutliningIndicators/ExpandedSubBlockStart.gif)
public void setName(String string)
{
name = string;
}
![](../../Images/OutliningIndicators/ExpandedSubBlockStart.gif)
/** *//**
* @see java.lang.Object#toString()
*/
![](../../Images/OutliningIndicators/ExpandedSubBlockStart.gif)
public String toString()
{
return "name:"+name + ",id:" + id + ",address:"+address;
}
![](../../Images/OutliningIndicators/InBlock.gif)
}
test.jsp
<%@ page import="com.ccctc.view.web.*" %>
![](../../Images/OutliningIndicators/None.gif)
<%
User u = (User)session.getAttribute("currentUser");
String name = request.getParameter("user");
![](../../Images/OutliningIndicators/None.gif)
![](../../Images/OutliningIndicators/ExpandedBlockStart.gif)
if(u != null)
{
String remote = request.getRemoteAddr();
u.setAddress(remote);
}
![](../../Images/OutliningIndicators/None.gif)
//User Login
![](../../Images/OutliningIndicators/ExpandedBlockStart.gif)
if(name != null)
{
![](../../Images/OutliningIndicators/ExpandedSubBlockStart.gif)
if(u != null)
{
session.setAttribute("_listener",OnlineUsers.getInstance());
u.setName(name);
}
}
![](../../Images/OutliningIndicators/None.gif)
//User Logout
String logout = request.getParameter("logout");
![](../../Images/OutliningIndicators/ExpandedBlockStart.gif)
if(logout != null)
{
session.removeAttribute("_listener");
}
%>
![](../../Images/OutliningIndicators/None.gif)
current users:<p>
![](../../Images/OutliningIndicators/None.gif)
<%
java.util.Collection l = OnlineUsers.getInstance().getUsers();
for(java.util.Iterator it = l.iterator(); it.hasNext();)
![](../../Images/OutliningIndicators/ExpandedBlockStart.gif)
![](../../Images/OutliningIndicators/ContractedBlock.gif)
{
User tu = (User)it.next();
if(u.equals(tu))
![](../../Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
%>
../../Images/OutliningIndicators/In
在给出代码之前,先简单说一下监听器的常识。
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文件里了。
下面是具体的代码:
![](../../Images/OutliningIndicators/ExpandedBlockStart.gif)
![](../../Images/OutliningIndicators/ContractedBlock.gif)
![](../../Images/OutliningIndicators/InBlock.gif)
![](../../Images/OutliningIndicators/InBlock.gif)
![](../../Images/OutliningIndicators/ExpandedBlockEnd.gif)
![](../../Images/OutliningIndicators/None.gif)
![](../../Images/OutliningIndicators/None.gif)
![](../../Images/OutliningIndicators/None.gif)
![](../../Images/OutliningIndicators/None.gif)
![](../../Images/OutliningIndicators/None.gif)
![](../../Images/OutliningIndicators/ExpandedBlockStart.gif)
![](../../Images/OutliningIndicators/ContractedBlock.gif)
![](../../Images/OutliningIndicators/InBlock.gif)
![](../../Images/OutliningIndicators/InBlock.gif)
![](../../Images/OutliningIndicators/ExpandedBlockEnd.gif)
![](../../Images/OutliningIndicators/None.gif)
![](../../Images/OutliningIndicators/ExpandedBlockStart.gif)
![](../../Images/OutliningIndicators/ContractedBlock.gif)
![](../../Images/dot.gif)
![](../../Images/OutliningIndicators/InBlock.gif)
![](../../Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](../../Images/OutliningIndicators/ContractedSubBlock.gif)
![](../../Images/OutliningIndicators/InBlock.gif)
![](../../Images/OutliningIndicators/InBlock.gif)
![](../../Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
![](../../Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](../../Images/OutliningIndicators/ContractedSubBlock.gif)
![](../../Images/dot.gif)
![](../../Images/OutliningIndicators/InBlock.gif)
![](../../Images/OutliningIndicators/InBlock.gif)
![](../../Images/OutliningIndicators/InBlock.gif)
![](../../Images/OutliningIndicators/InBlock.gif)
![](../../Images/OutliningIndicators/InBlock.gif)
![](../../Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
![](../../Images/OutliningIndicators/InBlock.gif)
![](../../Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](../../Images/OutliningIndicators/ContractedSubBlock.gif)
![](../../Images/OutliningIndicators/InBlock.gif)
![](../../Images/OutliningIndicators/InBlock.gif)
![](../../Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
![](../../Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](../../Images/OutliningIndicators/ContractedSubBlock.gif)
![](../../Images/dot.gif)
![](../../Images/OutliningIndicators/InBlock.gif)
![](../../Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
![](../../Images/OutliningIndicators/InBlock.gif)
![](../../Images/OutliningIndicators/ExpandedBlockEnd.gif)
![](../../Images/OutliningIndicators/None.gif)
![](../../Images/OutliningIndicators/None.gif)
![](../../Images/OutliningIndicators/ExpandedBlockStart.gif)
![](../../Images/OutliningIndicators/ContractedBlock.gif)
![](../../Images/OutliningIndicators/InBlock.gif)
![](../../Images/OutliningIndicators/InBlock.gif)
![](../../Images/OutliningIndicators/ExpandedBlockEnd.gif)
![](../../Images/OutliningIndicators/None.gif)
![](../../Images/OutliningIndicators/None.gif)
![](../../Images/OutliningIndicators/None.gif)
![](../../Images/OutliningIndicators/None.gif)
![](../../Images/OutliningIndicators/None.gif)
![](../../Images/OutliningIndicators/None.gif)
![](../../Images/OutliningIndicators/None.gif)
![](../../Images/OutliningIndicators/None.gif)
![](../../Images/OutliningIndicators/None.gif)
![](../../Images/OutliningIndicators/None.gif)
![](../../Images/OutliningIndicators/ExpandedBlockStart.gif)
![](../../Images/OutliningIndicators/ContractedBlock.gif)
![](../../Images/OutliningIndicators/InBlock.gif)
![](../../Images/OutliningIndicators/InBlock.gif)
![](../../Images/OutliningIndicators/ExpandedBlockEnd.gif)
![](../../Images/OutliningIndicators/ExpandedBlockStart.gif)
![](../../Images/OutliningIndicators/ContractedBlock.gif)
![](../../Images/dot.gif)
![](../../Images/OutliningIndicators/InBlock.gif)
![](../../Images/OutliningIndicators/InBlock.gif)
![](../../Images/OutliningIndicators/InBlock.gif)
![](../../Images/OutliningIndicators/InBlock.gif)
![](../../Images/OutliningIndicators/InBlock.gif)
![](../../Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](../../Images/OutliningIndicators/ContractedSubBlock.gif)
![](../../Images/dot.gif)
![](../../Images/OutliningIndicators/InBlock.gif)
![](../../Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
![](../../Images/OutliningIndicators/InBlock.gif)
![](../../Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](../../Images/OutliningIndicators/ContractedSubBlock.gif)
![](../../Images/OutliningIndicators/InBlock.gif)
![](../../Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
![](../../Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](../../Images/OutliningIndicators/ContractedSubBlock.gif)
![](../../Images/dot.gif)
![](../../Images/OutliningIndicators/InBlock.gif)
![](../../Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
![](../../Images/OutliningIndicators/InBlock.gif)
![](../../Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](../../Images/OutliningIndicators/ContractedSubBlock.gif)
![](../../Images/dot.gif)
![](../../Images/OutliningIndicators/InBlock.gif)
![](../../Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
![](../../Images/OutliningIndicators/InBlock.gif)
![](../../Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](../../Images/OutliningIndicators/ContractedSubBlock.gif)
![](../../Images/dot.gif)
![](../../Images/OutliningIndicators/InBlock.gif)
![](../../Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
![](../../Images/OutliningIndicators/InBlock.gif)
![](../../Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](../../Images/OutliningIndicators/ContractedSubBlock.gif)
![](../../Images/OutliningIndicators/InBlock.gif)
![](../../Images/OutliningIndicators/InBlock.gif)
![](../../Images/OutliningIndicators/InBlock.gif)
![](../../Images/OutliningIndicators/InBlock.gif)
![](../../Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
![](../../Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](../../Images/OutliningIndicators/ContractedSubBlock.gif)
![](../../Images/dot.gif)
![](../../Images/OutliningIndicators/InBlock.gif)
![](../../Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
![](../../Images/OutliningIndicators/InBlock.gif)
![](../../Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](../../Images/OutliningIndicators/ContractedSubBlock.gif)
![](../../Images/OutliningIndicators/InBlock.gif)
![](../../Images/OutliningIndicators/InBlock.gif)
![](../../Images/OutliningIndicators/InBlock.gif)
![](../../Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
![](../../Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](../../Images/OutliningIndicators/ContractedSubBlock.gif)
![](../../Images/dot.gif)
![](../../Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](../../Images/OutliningIndicators/ContractedSubBlock.gif)
![](../../Images/dot.gif)
![](../../Images/OutliningIndicators/InBlock.gif)
![](../../Images/OutliningIndicators/InBlock.gif)
![](../../Images/OutliningIndicators/InBlock.gif)
![](../../Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](../../Images/OutliningIndicators/ContractedSubBlock.gif)
![](../../Images/dot.gif)
![](../../Images/OutliningIndicators/InBlock.gif)
![](../../Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
![](../../Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
![](../../Images/OutliningIndicators/InBlock.gif)
![](../../Images/OutliningIndicators/InBlock.gif)
![](../../Images/OutliningIndicators/ExpandedBlockEnd.gif)
![](../../Images/OutliningIndicators/None.gif)
![](../../Images/OutliningIndicators/None.gif)
![](../../Images/OutliningIndicators/ExpandedBlockStart.gif)
![](../../Images/OutliningIndicators/ContractedBlock.gif)
![](../../Images/OutliningIndicators/InBlock.gif)
![](../../Images/OutliningIndicators/InBlock.gif)
![](../../Images/OutliningIndicators/ExpandedBlockEnd.gif)
![](../../Images/OutliningIndicators/None.gif)
![](../../Images/OutliningIndicators/None.gif)
![](../../Images/OutliningIndicators/ExpandedBlockStart.gif)
![](../../Images/OutliningIndicators/ContractedBlock.gif)
![](../../Images/OutliningIndicators/InBlock.gif)
![](../../Images/OutliningIndicators/InBlock.gif)
![](../../Images/OutliningIndicators/ExpandedBlockEnd.gif)
![](../../Images/OutliningIndicators/ExpandedBlockStart.gif)
![](../../Images/OutliningIndicators/ContractedBlock.gif)
![](../../Images/dot.gif)
![](../../Images/OutliningIndicators/InBlock.gif)
![](../../Images/OutliningIndicators/InBlock.gif)
![](../../Images/OutliningIndicators/InBlock.gif)
![](../../Images/OutliningIndicators/InBlock.gif)
![](../../Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](../../Images/OutliningIndicators/ContractedSubBlock.gif)
![](../../Images/OutliningIndicators/InBlock.gif)
![](../../Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
![](../../Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](../../Images/OutliningIndicators/ContractedSubBlock.gif)
![](../../Images/dot.gif)
![](../../Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](../../Images/OutliningIndicators/ContractedSubBlock.gif)
![](../../Images/dot.gif)
![](../../Images/OutliningIndicators/InBlock.gif)
![](../../Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
![](../../Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](../../Images/OutliningIndicators/ContractedSubBlock.gif)
![](../../Images/dot.gif)
![](../../Images/OutliningIndicators/InBlock.gif)
![](../../Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
![](../../Images/OutliningIndicators/InBlock.gif)
![](../../Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
![](../../Images/OutliningIndicators/InBlock.gif)
![](../../Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](../../Images/OutliningIndicators/ContractedSubBlock.gif)
![](../../Images/OutliningIndicators/InBlock.gif)
![](../../Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
![](../../Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](../../Images/OutliningIndicators/ContractedSubBlock.gif)
![](../../Images/dot.gif)
![](../../Images/OutliningIndicators/InBlock.gif)
![](../../Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
![](../../Images/OutliningIndicators/InBlock.gif)
![](../../Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](../../Images/OutliningIndicators/ContractedSubBlock.gif)
![](../../Images/OutliningIndicators/InBlock.gif)
![](../../Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
![](../../Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](../../Images/OutliningIndicators/ContractedSubBlock.gif)
![](../../Images/dot.gif)
![](../../Images/OutliningIndicators/InBlock.gif)
![](../../Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
![](../../Images/OutliningIndicators/InBlock.gif)
![](../../Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](../../Images/OutliningIndicators/ContractedSubBlock.gif)
![](../../Images/OutliningIndicators/InBlock.gif)
![](../../Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
![](../../Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](../../Images/OutliningIndicators/ContractedSubBlock.gif)
![](../../Images/dot.gif)
![](../../Images/OutliningIndicators/InBlock.gif)
![](../../Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
![](../../Images/OutliningIndicators/InBlock.gif)
![](../../Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](../../Images/OutliningIndicators/ContractedSubBlock.gif)
![](../../Images/OutliningIndicators/InBlock.gif)
![](../../Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
![](../../Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](../../Images/OutliningIndicators/ContractedSubBlock.gif)
![](../../Images/dot.gif)
![](../../Images/OutliningIndicators/InBlock.gif)
![](../../Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
![](../../Images/OutliningIndicators/InBlock.gif)
![](../../Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](../../Images/OutliningIndicators/ContractedSubBlock.gif)
![](../../Images/OutliningIndicators/InBlock.gif)
![](../../Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
![](../../Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](../../Images/OutliningIndicators/ContractedSubBlock.gif)
![](../../Images/dot.gif)
![](../../Images/OutliningIndicators/InBlock.gif)
![](../../Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
![](../../Images/OutliningIndicators/InBlock.gif)
![](../../Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](../../Images/OutliningIndicators/ContractedSubBlock.gif)
![](../../Images/OutliningIndicators/InBlock.gif)
![](../../Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
![](../../Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](../../Images/OutliningIndicators/ContractedSubBlock.gif)
![](../../Images/dot.gif)
![](../../Images/OutliningIndicators/InBlock.gif)
![](../../Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
![](../../Images/OutliningIndicators/InBlock.gif)
![](../../Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](../../Images/OutliningIndicators/ContractedSubBlock.gif)
![](../../Images/OutliningIndicators/InBlock.gif)
![](../../Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
![](../../Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](../../Images/OutliningIndicators/ContractedSubBlock.gif)
![](../../Images/dot.gif)
![](../../Images/OutliningIndicators/InBlock.gif)
![](../../Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
![](../../Images/OutliningIndicators/InBlock.gif)
![](../../Images/OutliningIndicators/ExpandedBlockEnd.gif)
test.jsp
![](../../Images/OutliningIndicators/None.gif)
![](../../Images/OutliningIndicators/None.gif)
![](../../Images/OutliningIndicators/None.gif)
![](../../Images/OutliningIndicators/None.gif)
![](../../Images/OutliningIndicators/None.gif)
![](../../Images/OutliningIndicators/None.gif)
![](../../Images/OutliningIndicators/ExpandedBlockStart.gif)
![](../../Images/OutliningIndicators/ContractedBlock.gif)
![](../../Images/dot.gif)
![](../../Images/OutliningIndicators/InBlock.gif)
![](../../Images/OutliningIndicators/InBlock.gif)
![](../../Images/OutliningIndicators/InBlock.gif)
![](../../Images/OutliningIndicators/ExpandedBlockEnd.gif)
![](../../Images/OutliningIndicators/None.gif)
![](../../Images/OutliningIndicators/None.gif)
![](../../Images/OutliningIndicators/ExpandedBlockStart.gif)
![](../../Images/OutliningIndicators/ContractedBlock.gif)
![](../../Images/dot.gif)
![](../../Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](../../Images/OutliningIndicators/ContractedSubBlock.gif)
![](../../Images/dot.gif)
![](../../Images/OutliningIndicators/InBlock.gif)
![](../../Images/OutliningIndicators/InBlock.gif)
![](../../Images/OutliningIndicators/InBlock.gif)
![](../../Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
![](../../Images/OutliningIndicators/ExpandedBlockEnd.gif)
![](../../Images/OutliningIndicators/None.gif)
![](../../Images/OutliningIndicators/None.gif)
![](../../Images/OutliningIndicators/None.gif)
![](../../Images/OutliningIndicators/ExpandedBlockStart.gif)
![](../../Images/OutliningIndicators/ContractedBlock.gif)
![](../../Images/dot.gif)
![](../../Images/OutliningIndicators/InBlock.gif)
![](../../Images/OutliningIndicators/ExpandedBlockEnd.gif)
![](../../Images/OutliningIndicators/None.gif)
![](../../Images/OutliningIndicators/None.gif)
![](../../Images/OutliningIndicators/None.gif)
![](../../Images/OutliningIndicators/None.gif)
![](../../Images/OutliningIndicators/None.gif)
![](../../Images/OutliningIndicators/None.gif)
![](../../Images/OutliningIndicators/None.gif)
![](../../Images/OutliningIndicators/ExpandedBlockStart.gif)
![](../../Images/OutliningIndicators/ContractedBlock.gif)
![](../../Images/dot.gif)
![](../../Images/OutliningIndicators/InBlock.gif)
![](../../Images/OutliningIndicators/InBlock.gif)
![](../../Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](../../Images/OutliningIndicators/ContractedSubBlock.gif)
![](../../Images/dot.gif)
![](../../Images/OutliningIndicators/InBlock.gif)
发表评论
-
分享J2EE学习的20个网站
2009-11-10 11:07 1034前人栽树,后人乘凉。 ... -
struts2标签集
2009-11-12 11:38 527A: <s:a xhref="" ... -
struts2标签使用 (#$%)/js命名空间
2009-11-13 14:49 749session中存有UserVO值对象,其中有networkL ... -
Struts2使用之值栈与OGNL-使用
2009-11-25 16:47 965Struts2使用之值栈与OGNL-使用 ... -
jQuery+struts+json
2009-12-09 12:10 796在struts中采用jquery利用json数据来动态无刷新更 ... -
提高JAVA代码质量,减少代码缺陷
2009-12-09 14:10 1008这是最新一期IBM developworks的专题,摘录了一些 ... -
struts2.0标签应用–for循环的实现
2009-12-30 15:01 805<!--header.php end--> & ... -
JSP防止重复提交,重复刷新,后退
2010-01-06 12:24 1275一。前言 你在任何一个 ... -
struts2:利用标签显示List嵌套Map
2010-02-01 17:12 1095List中存放一个Map,利用<s:iterator/& ... -
REFERER及jsp中request.getHeader() 相关详细
2010-02-23 17:42 909在三种情况下,<%=request.getHeader( ... -
Ubuntu下安装和配置Apache2
2010-03-05 10:15 967在Ubuntu中安装apache 安装 ... -
Struts2的Result Type
2010-03-07 15:46 0chain 用来处理Act<wbr> ... -
Java读写cookie
2010-04-02 09:51 726<!--<br><br> ... -
JSP容器的初始化和销毁 - ServletContext(转)
2010-04-20 10:19 1269ServletContext 被 Servlet 程序用来与 ... -
快速建立Subversion服务器
2010-05-20 16:19 678如何快速建立Subversion服务器,并且在项目中 ... -
Apache安装设置 - Ubuntu中文
2010-06-24 15:39 733Apache 安装设 ... -
Log4J使用完全手册(转)
2010-07-14 22:08 771Log4J是Apache的一个开放源代码项目(http:// ...
相关推荐
主要介绍了Spring boot通过HttpSessionListener监听器统计在线人数的实现代码,非常不错,具有参考借鉴价值,需要的朋友可以参考下
用户登录时,调用LoginServlet,将用户名写入application的在线用户列表中,用户退出时,调用LogoutServlet,调用session.invalidate(),交给HttpSessionListener的sessionDestroyed()方法,将用户从在线列表中删除。...
用HttpSessionListener实现在线人数和历史访问量的统计
jsp 统计在线人数实例,是个完整的项目实例,部署即可查看效果! 通过使用:HttpSessionListener、HttpSessionBindingListener来实现. valueBound 方法登录触发。 valueUnbound 方法退出触发。
使用SessionListener+持久化Session+Springmvc拦截器实现单点登录
实现在线人的显示,通过实现ServletContenxListener,HttpSessionListener,HttpSessionAttributeListener来实现在线人的展示
此类通过监听器实现了在线人数统计,其原理很简单,就是每当增加一个HttpSession时就触发了实现HttpSessionListener接口的类的SessionCreated()方法,使在线人数加1....
在踢人效果实现中,我们需要使用forceLogoutUser方法,该方法用于强行退出已经在线的用户。该方法接受一个参数:要强行退出的用户的ID。在方法中,我们首先从sessionMap中获取对应的Session对象,然后清空Session...
HttpSessionListener 和HttpSessionBindingListener的区别 HttpSessionBindingListener单点登录。
每隔一分钟统计在线人数 very good very strong
用户注销 非正常退出 session失效 三种情况来进行 控制 分别使用了两种方式 进行了实现1:不修改数据库使用HashMap+HttpSessionListener 2:给数据库添加online列 使用(数据库脚本包含在内)HashMap+...
jsp中唯一登录,使用session控制.
【资源说明】 1、基于springboot+MyBatis实现的某房产平台系统源码+项目说明(毕设).zip 2、该资源包括项目的全部源码,下载可以直接使用! 3、本项目适合作为计算机...HttpSessionListener监听器统计系统当前在线人数
您好,请访问:http://msdn.microsoft.com/zh-cn/library/aa478989.aspx [^] Yours Farhad。
springBoot ... ... ...Nginx:反向代理服务器,Nginx搭建支持用户头像等静态资源的访问 ...Spring Admin(外部监控)、Spring Actuator(内部监控平台) ...SpringBoot CORS实现跨域 ...HttpSessionListener监听器统计系统当前在线人数
主要介绍了java 在Jetty9中使用HttpSessionListener和Filter的相关资料,需要的朋友可以参考下
8.1. 使用HttpSessionListener 8.2. 使用HttpSessionBindingListener 9. 封装taglib组件 9.1. 用taglib实现循环 9.2. 关于jstl 10. 综合电子留言板 10.1. 电子留言板用户指南 10.2. 数据库设计 10.3. 功能设计...
实现的接口:ServletRequestListener,HttpSessionListener,ServletContextListener 工程的大致步骤: 1.自定义实现三个监听器的类 2.使用注解的方法注册监听器 3.部署工程并运行,在控制台会输出相应的信息
public class AmpList implements ServletContextListener,HttpSessionListener,HttpSessionAttributeListener { private ServletContext application=null; public void contextInitialized(ServletContext
public class DialogHttpSessionListner implements HttpSessionListener { private static Map, HttpSession> httpssessionmap = new Hashtable, HttpSession>(); // private UserVo uservo=new UserVo(); ...