用户提出要求,需要知道哪些用户已经登录,但是在实际环境中,程序被部署到3台web上,前端用f5的负载均衡,那玩意没有玩过,幸好数据库是单一的,所以就简单建立了一个MySQL的内存表(Heap Table),来已经登录的用户信息。
package com.nbrc.lddw.util;
import javax.servlet.http.HttpSession;
import javax.servlet.http.HttpSessionAttributeListener;
import javax.servlet.http.HttpSessionBindingEvent;
import javax.servlet.http.HttpSessionBindingListener;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.context.ApplicationContext;
import org.springframework.web.context.support.WebApplicationContextUtils;
import com.nbrc.lddw.interceptor.AuthorizeInterceptor;
import com.nbrc.lddw.model.OnlineInfo;
import com.nbrc.lddw.model.User;
import com.nbrc.lddw.service.OnlineUserService;
/**
*
* @author fox
* @date 2009-02-09
* @description 已登录用户的监听
*/
public class OnlineUserListener implements HttpSessionAttributeListener {
private static Log log = LogFactory.getLog(OnlineUserListener.class);
public void attributeAdded(HttpSessionBindingEvent hse) {
log.info("value bound! make session info ...");
HttpSession session = hse.getSession();
ApplicationContext context =
WebApplicationContextUtils.getRequiredWebApplicationContext(session.getServletContext());
OnlineUserService svr = (OnlineUserService)context.getBean("onlineService");
User u = null;
if(session.getAttribute(AuthorizeInterceptor.USR_KEY)!=null)
u = (User) session.getAttribute(AuthorizeInterceptor.USR_KEY);
if(u!=null && svr.findByUserId(u.getId())==null){
OnlineInfo info = new OnlineInfo();
info.setSessionId(session.getId());
info.setUserId(u.getId());
svr.save(info);
}else{
log.error("can't get user in session");
}
}
public void attributeRemoved(HttpSessionBindingEvent hse) {
HttpSession session = hse.getSession();
ApplicationContext context = WebApplicationContextUtils.getRequiredWebApplicationContext(session.getServletContext());
OnlineUserService svr = (OnlineUserService)context.getBean("onlineService");
if(svr.findById(session.getId())!=null){
svr.removeById(session.getId());
}
}
public void attributeReplaced(HttpSessionBindingEvent se) {
// TODO Auto-generated method stub
}
}
不过这里还有一个bug,当用户关闭浏览器的时候,还需要将Session里面的内容清除,显示的才是正确的内容。
分享到:
相关推荐
总结一下,通过使用`HttpSessionAttributeListener`,我们可以监听登录用户的会话属性,从而动态维护登录用户列表。同时,结合会话管理机制,我们可以实现踢人功能,即强制结束特定用户的会话。这种技术在多人在线...
此外,你还可以使用`HttpSessionAttributeListener`来监听Session属性的变化,比如当用户信息被添加到Session时触发检查,但这可能会增加额外的处理开销。 除了Java监听器,现代Web框架如Spring Security也提供了...
6. 当检测到新的登录尝试时,检查是否存在已登录的Session。如果存在,注销旧的Session并发送通知。 通过以上步骤,我们就可以实现一个系统,它能检测并阻止同一用户在多个客户端同时登录。这种方法提高了系统的...
在实际开发中,还可以结合`HttpSessionAttributeListener`来监听特定Session属性的变化,例如用户信息、购物车数据等,这在实现用户行为跟踪、购物车更新等功能时非常有用。 总的来说,Java Session监听器是Web应用...
2. **会话监听器**: 可以监控用户的会话状态,如检测会话超时、会话创建和销毁等,常用于实现单点登录、在线用户统计等功能。 3. **请求监听器**: 虽然Java标准API中没有直接提供请求监听器,但可以通过过滤器...
在本主题“day18 监听器”中,我们将探讨如何利用监听器来统计在线人数、定时销毁超时session、实现session的钝化与活化,以及如何在系统中显示在线用户列表和实现踢人功能,从而防止用户自动登录。同时,还会涉及...
1. 统计在线用户:通过监听Session的创建和销毁,可以统计网站的实时在线用户数量。 2. 用户行为分析:记录用户Session的活跃时间、访问路径等,用于分析用户行为。 3. 资源管理:在Session销毁时释放占用的资源,...
在"监听器访问计数"的场景下,我们通常会使用HttpSessionListener或者HttpSessionAttributeListener来实现在线人数的统计。例如,当一个用户打开一个Web页面时,创建一个新的会话,监听器会接收到这个事件并增加在线...
根据提供的文件信息,我们可以深入探讨Java中如何利用监听器机制来实现对客户端请求和服务端操作的监听功能。这里主要涉及到了Java Web应用中的监听器,尤其是`HttpSessionListener`和`HttpSessionAttributeListener...
例如,我们可以通过HttpSessionAttributeListener监听到会话属性的变化,这在实现用户在线状态跟踪或个性化推荐时非常有用。 在"listener"这个压缩包文件中,可能包含了以下内容: 1. 实现监听器接口的Java源代码...
##### 3.1 保存在线用户信息 - 在`HttpSessionListener`中定义一个全局的`Map`对象,用来保存当前已登录的用户。 - 当用户登录成功时,将用户名保存到`HttpSession`中,并通过`HttpSessionAttributeListener`的`...
在JavaEE环境中,监听器是实现特定功能的特殊类,它们可以监听和响应应用程序中的特定事件,例如用户的登录、注销、session创建或销毁等。这些事件驱动的机制使得开发者能够更灵活地控制应用程序的行为,而无需直接...
4. **编写监听器**:实现`HttpSessionListener`接口,重写`sessionCreated()`与`sessionDestroyed()`方法,以便在用户登录和注销时更新在线用户列表。 5. **配置监听器**:在`web.xml`中注册监听器。 6. **页面展示*...
`HttpSessionListener`可以监听Session的创建和销毁,而`HttpSessionAttributeListener`则可以监听Session属性的添加、移除和替换。 1. **创建Session监听器** 创建一个实现了`HttpSessionListener`接口的类,例如...
- `HttpSessionAttributeListener`: 监听会话属性的变化,可用于实现会话数据的同步和管理。 4. **自定义监听器** 开发者可以创建自己的监听器类,只需让类实现相应的监听器接口,并覆盖接口中定义的方法。例如,...
2. **用户登录**:当用户成功登录时,将用户信息(如用户名或用户ID)作为一个对象存储到session中,并将该对象注册为`HttpSessionBindingListener`。 3. **监听绑定事件**:在`valueBound()`方法中,你可以增加...
用户已登录。 ``` ### 总结 通过上述介绍可以看出,session监听和attribute监听是Java Web开发中非常实用的技术。它们可以帮助开发者轻松实现诸如在线用户统计、用户信息管理等功能。理解并掌握这两种监听机制,...
开发者可以通过实现这些接口,比如在用户登录时创建会话,在会话过期或者用户注销时清理相关资源。 2. **ServletRequestListener** 和 **ServletRequestAttributeListener**: 它们可以监听HTTP请求的开始和结束,...
- 例如,可以在用户登录时记录其登录时间,以便于后续的操作。 ##### 5. 特殊监听器 - **HttpSessionBindingListener** 和 **HttpSessionActivationListener**: - 这两个监听器主要用于实现对象的序列化和反...