统计在线用户数以及同账号登录踢出另一用户
2017-06-14 15:42
381 查看
参考博客:http://blog.csdn.net/licheng989/article/details/51579979
思路:写一个session属性监听器(SessionListener),实现HttpSessionAttributeListener接口,定义两个map,一个(key=username,value=session);另一个(key=username,value=user)。map的size()就是在线用户数。每个用户登录时,先检查map中是否已存在该用户,如果不存在,就新增到map里面去,如果存在,就通过用户编号找对应session使其失效.再将当前登录用户信息写入到map里面。
页面上的在线人数这样获取:
注销时,这样写:
/**
如果用户非法退出,如直接关闭浏览器,关闭窗口等.这时session并不会立即失效,只能等待session失效.session的失效时常是在web.xml里面设置的.
session失效时,也是会触发属性移除时间的.
思路:写一个session属性监听器(SessionListener),实现HttpSessionAttributeListener接口,定义两个map,一个(key=username,value=session);另一个(key=username,value=user)。map的size()就是在线用户数。每个用户登录时,先检查map中是否已存在该用户,如果不存在,就新增到map里面去,如果存在,就通过用户编号找对应session使其失效.再将当前登录用户信息写入到map里面。
import java.util.HashMap; import java.util.Map; import javax.servlet.http.HttpSession; import javax.servlet.http.HttpSessionAttributeListener; import javax.servlet.http.HttpSessionBindingEvent; import com.sunshine.monitor.system.manager.bean.SysUser; /** * session属性监听,用于统计在线用户数,同一账户登录踢出在线用户 * 对于直接关闭浏览器的操作等待session失效之后,才能做到清除. * @date 2016-6-1 * @author licheng * */ public class SessionListener implements HttpSessionAttributeListener{ /** * 定义监听的session属性名 */ public final static String LISTENER_NAME = "_login"; public final static String LISTENER_COUNT = "_count"; /** * 定义存储客户登录用户的集合 */ private static Map<String, SysUser> users = new HashMap<String, SysUser>(); /** * 定义存储客户登录session的集合 */ private static Map<String, HttpSession> sessions = new HashMap<String, HttpSession>(); /** * 定义存储在线用户数的集合 */ private static Map<String, Integer> counts = new HashMap<String, Integer>(); /** * 加入session时的监听方法 * * @param HttpSessionBindingEvent * session事件 */ public void attributeAdded(HttpSessionBindingEvent sbe) { if(LISTENER_NAME.equals(sbe.getName())){ SysUser s = (SysUser) sbe.getValue(); if(users.containsKey(s.getYhdh())) { HttpSession session = sessions.get(s.getYhdh()); session.removeAttribute(LISTENER_NAME); session.invalidate(); } sessions.put(s.getYhdh(), sbe.getSession()); users.put(s.getYhdh(), s); } Integer count = users.size(); counts.put(LISTENER_COUNT, count); } /** * session失效时的监听方法 * * @param HttpSessionBindingEvent * session事件 */ public void attributeRemoved(HttpSessionBindingEvent sbe) { if(LISTENER_NAME.equals(sbe.getName())){ // 从session集合中减去一个 SysUser s = (SysUser) sbe.getValue(); sessions.remove(s.getYhdh()); users.remove(s.getYhdh()); counts.put(LISTENER_COUNT, users.size()); } } /** * session覆盖时的监听方法 * * @param HttpSessionBindingEvent * session事件 */ public void attributeReplaced(HttpSessionBindingEvent sbe) { } public static Map<String, SysUser> getUsers() { return users; } public static Map<String, HttpSession> getSessions() { return sessions; } public static Map<String, Integer> getCounts() { return counts; } }监听器写好之后要在web.xml里面配置一下.
<listener> <listener-class>com.sunshine.monitor.comm.filter.SessionListener</listener-class> </listener>如何使用呢,用户登录时给session设置一个数据,获取在线用户数
request.getSession().setAttribute(SessionListener.LISTENER_NAME, s); application.setAttribute("online", SessionListener.getCounts().get(SessionListener.LISTENER_COUNT));
页面上的在线人数这样获取:
<c:out value="${online}"></c:out>
注销时,这样写:
/**
* 注销移除sesson,从设置application的onlines属性 * @param request * @param response * @return */ @RequestMapping public ModelAndView logout(HttpServletRequest request, HttpServletResponse response){ ModelAndView mv = new ModelAndView(forwardLoginPath); HttpSession session = request.getSession(); session.removeAttribute(SessionListener.LISTENER_NAME); session.invalidate(); session.getServletContext().setAttribute("online", SessionListener.getCounts().get(SessionListener.LISTENER_COUNT)); return mv; }
如果用户非法退出,如直接关闭浏览器,关闭窗口等.这时session并不会立即失效,只能等待session失效.session的失效时常是在web.xml里面设置的.
session失效时,也是会触发属性移除时间的.
/**
* 注销移除sesson,从设置application的onlines属性 * @param request * @param response * @return */ @RequestMapping public ModelAndView logout(HttpServletRequest reque c7e9 st, HttpServletResponse response){ ModelAndView mv = new ModelAndView(forwardLoginPath); HttpSession session = request.getSession(); session.removeAttribute(SessionListener.LISTENER_NAME); session.invalidate(); session.getServletContext().setAttribute("online", SessionListener.getCounts().get(SessionListener.LISTENER_COUNT)); return mv; }
相关文章推荐
- 统计在线用户数以及同账号登录踢出另一用户
- 如何处理多人同时登录同一个账号以及如何统计在线人数和访问量?
- java session HttpSessionListener、HttpSessionBindingListener使用区别,实现在线人数统计以及踢出用户
- asp 实现同一帐号,防止多人同时登录、获取在线列表、实现登录日志(可用户统计在线时长),适合用户访问量大的系统
- 统计用户在线登录人数
- 用户在线登录时长统计
- asp 实现同一帐号,防止多人同时登录、获取在线列表、实现登录日志(可用户统计在线时长),适合用户访问量大的系统
- 在线用户信息统计&单用户登录(update)
- 在线登录用户统计
- 利用Redis实现亿级别用户登录统计(活跃度以及登录次数统计)
- javaEE SSH框架记录在线登录用户以及登录用户的在线时长
- 在线用户信息统计&单用户登录
- 数据处理三之 用户在线时长和登录次数统计
- java session HttpSessionListener、HttpSessionBindingListener使用区别,实现在线人数统计以及踢出用户
- 利用Redis实现亿级别用户登录统计(活跃度以及登录次数统计)
- .net C# 利用session控制用户重复登录及统计在线用户数解决方案
- 统计在线已登录用户数量并获取客户端IP(涉及HttpSessionListener监听)
- 在线用户、登录用户统计
- scala实战之spark用户在线时长和登录次数统计实例
- CCS bug之3: 在线用户是统计最近一个小时的,不符合用户习惯,也没有配置项可以改