用户提出要求,需要知道哪些用户已经登录,但是在实际环境中,程序被部署到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
NULL 博文链接:https://franciswmf.iteye.com/blog/1831974
关于Servlet监听器的几个例子,用于统计在线人数等等
实现在线人的显示,通过实现ServletContenxListener,HttpSessionListener,HttpSessionAttributeListener来实现在线人的展示
* 用户登录 v1.8 sql注入的演示 v1.9 * 分销商树的展现 v2.0 * 修改区域和分销商 v2.1 * 添加区域或分销商 v2.2 * 删除区域和分销商 v2.3 * 修改密码 * 会计核算期间维护 * 建立物料对象...
################ tips...借助Junit和Spring TestContext framework 和RestController监听器的作用: 监听对象 监听对象的属性 1:统计在线人数和在线用户 HttpSessionListener httpSessionAttributeListener 2:系统启
学习servlet的实例 说明文件 blog ...类 HttpSession Cookie HttpSessionAttributeListener HttpServlet HttpServletRequest HttpServeltResponse <br>
HttpSessionAttributeListener HttpSessionBindingEvent HttpSessionBindingListener HttpSessionContext HttpSessionEvent HttpSessionListener HttpUtils RequestDispatcher Servlet ServletConfig ...
javax.servlet.Filter javax.servlet.Servlet javax.servlet.FilterChain ...javax.servlet.FilterConfig ...javax.servlet.http.HttpSessionAttributeListener javax.servlet.http.HttpSessionActivationListener
好郁闷哦,搞了两个多小时,我把先把HttpSessionAttributeListener 接口的方法实现了
javax.servlet.http.HttpSessionAttributeListener.class javax.servlet.http.HttpServlet.class javax.servlet.http.HttpServletRequest.class javax.servlet.http.HttpServletResponse.class javax.servlet....
attributeAdded(HttpSessionBindingEvent) - Method in interface javax.servlet.http.HttpSessionAttributeListener Notification that an attribute has been added to a session. attributeAdded...