单机登录实现思路(强制下线其他用户)
2014-07-07 20:06
337 查看
主流的网站都是限制用户单点登录的,为什么要实现单点登录?
1、避免单账号多用户操作占用大量数据库连接,减轻webserver的压力;
2、安全防范,强制下线非法用户;
传统的web服务器(如tomcat)对session有专门的管理,我们通过session来控制用户的登录生存周期。单点登录原理如下:
1、将当前的session以Collections的形式缓存在application当中,用户产生新的session,即清除用户之前的session,保证collection里面的usersession都是唯一的;
2、实现效果每次用户登录都会挤掉之前用户的登录,每个用户只能唯一在线;
LoginManager.java
新增和废弃ServletContext里面的sessionMap的用户session
1、避免单账号多用户操作占用大量数据库连接,减轻webserver的压力;
2、安全防范,强制下线非法用户;
传统的web服务器(如tomcat)对session有专门的管理,我们通过session来控制用户的登录生存周期。单点登录原理如下:
1、将当前的session以Collections的形式缓存在application当中,用户产生新的session,即清除用户之前的session,保证collection里面的usersession都是唯一的;
2、实现效果每次用户登录都会挤掉之前用户的登录,每个用户只能唯一在线;
ServletContext application = request.getSession().getServletContext(); Collection<HttpSession> sessions = null; if (application.getAttribute("usercount") == null) { sessions = new ArrayList<HttpSession>(); application.setAttribute("usercount", sessions); } else { sessions = (Collection<HttpSession>) application .getAttribute("usercount"); } new LoginManager().login(sessions, session); SessionHandler.handleSession(session);
public static boolean isLogin(HttpServletRequest request) { TuserEntity tuser = getUser(request); if(tuser!=null){ Map<String, HttpSession> map = (Map<String, HttpSession>) request.getSession() .getServletContext().getAttribute("sessionMap"); if(map.get(tuser.getLogname())==null){ request.getSession().invalidate(); return false; } } return getUser(request) != null; }
LoginManager.java
public class LoginManager { public HttpSession login(Collection<HttpSession> sessions, HttpSession session) { ArrayList<HttpSession> sessionde = new ArrayList<HttpSession>(); for (HttpSession s : sessions) { try { int historyuser = ((TuserEntity) s.getAttribute("user_session")).getId(); int nowuser = ((TuserEntity) session.getAttribute("user_session")) .getId(); if (historyuser == nowuser) { sessions.remove(s); // 移除集合中的重复session元素 if(!s.equals(session)){ s.invalidate();// 废弃之前登陆的session } break; } } catch (Exception e) { //e.printStackTrace(); sessionde.add(s); } } for (int i = 0; i < sessionde.size(); i++) { sessions.remove((HttpSession) sessionde.get(i)); } sessions.add(session); return null; } }
新增和废弃ServletContext里面的sessionMap的用户session
public static void handleSession(HttpSession session) { try { Map<String, HttpSession> sessionMap = (Map<String, HttpSession>) session.getServletContext().getAttribute("sessionMap"); TuserEntity tuser = (TuserEntity) session.getAttribute(Keys.USER_SESSION_KEY); if(sessionMap.get(tuser.getLogname())!=null){ sessionMap.remove(tuser.getLogname()); } sessionMap.put(tuser.getLogname(), session); } catch (Exception e) { System.out.println("session error!"); } }
public void sessionDestroyed(HttpSessionEvent se) { Map<String, HttpSession> sessionMap = (Map<String, HttpSession>) se.getSession().getServletContext().getAttribute("sessionMap"); TuserEntity tuser = (TuserEntity) se.getSession().getAttribute(Keys.USER_SESSION_KEY); if(tuser!=null){ sessionMap.remove(tuser.getLogname()); } }
相关文章推荐
- 单机登录实现思路(强制下线其他用户)
- 用户登录之后实现强制下线的功能
- QQ快捷登录提示:禁止开发商强制用户重新注册或绑定其他帐号
- 关于一个普通的系统中用户注销后以其他用户登录的实现
- Java SSH框架系列:用户登录模块的设计与实现思路
- PHP用户登录后跳转回上一访问页面的实现思路及代码
- 如何实现登录互踢 即如何实现当用户登录之后 如果在其他地方再次登录 则这边的用户自动退出系统
- Java SSH框架系列:用户登录模块的设计与实现思路
- 【实战】广播实践,实现登录强制下线
- struts做的记录当前在线用户,不可重复登录,并且可对在线用户进行强制下线
- Java SSH框架系列:用户登录模块的设计与实现思路
- 不允许超级管理员同时登录,如果管理员登录时已经有其他管理员登陆了,则提示“您已通过其他浏览器登录,请退出后再登陆或者强制下线”,如果点击“强制下线”则进入后台管理中心,而以前登录的管理员下线。
- 关于用户登录的记住密码实现思路(考虑到安全问题)
- spring security 在没实现session共享的集群环境下 防止用户多次登录的 实现思路
- Linux系统下强制其他用户下线
- Android基于人脸识别的用户注册/登录实现思路
- Linux登录系统后了解用户、用户组、登录的终端以及root用户强制指定终端用户下线的小结
- Asp.net项目同一个用户后登录把前面登录的踢下线的两种实现方法
- 获取用户下线时间的实现思路
- 实现单点登录并强制对方下线