牛骨文教育服务平台(让学习变的简单)
博文笔记

禁止多人使用同一账号在系统上进行操作[踢人操作]

创建时间:2015-04-02 投稿人: 浏览次数:984

 在开发中遇到一个问题,系统内,同一个账号可以在不同的地方多个人同时进行登陆,操作。

   要求是同一账号在系统内必须保持唯一,即,若是有人用同一账号登陆了,已登录账号失效        解决方案有两种:     一种是在系统中设置状态位,登陆签到,退出签退...至于异常退出,在旧的session销毁之前是无法再次进行登陆的,配置session的监听,在session销毁时,进行数据库操作,更改库里对应用户的状态位     另一种思想:在服务器上维护一个map,以用户唯一标识为主键,值为session,登录时判断该用户是否已在,不在的话加入,已在的话将原session销毁,放入现有的session,这样的话前面登陆的人就不能再进行操作了。
下面实现后者,前者的话也是一样的

   实现: 使用java.util.concurrent.ConcurrentHashMap
ConcurrentHashMap 是 Doug Lea 的 util.concurrent 包的一部分,它提供比Hashtable 或者 synchronizedMap 更高程度的并发性。而且,对于大多数成功的 get() 操作它会设法避免完全锁定,其结果就是使得并发应用程序有着非常好的吞吐量。

[java] view plaincopyprint?
  1. public class SessionHandler {  
  2. private static final  ConcurrentHashMap<String, HttpSession> sessionMap = new                                                                    ConcurrentHashMap<String, HttpSession>();  
  3. //登陆时调用  
  4.   public static synchronized void kickUser(String userId,HttpSession session){  
  5. HttpSession oldSession = sessionMap.get(userId);  
  6. if(oldSession != null){  
  7. if(!oldSession.getId().equals(session.getId())){  
  8. try{  
  9. oldSession .invalidate();  
  10. }catch(Exception ex){}  
  11. sessionMap.put(userId, session);  
  12. return ;  
  13. }  
  14. }  
  15. sessionMap.put(userId, session);  
  16. }  
  17. //正常退出时调用  
  18. public static void removeUserFromSessionMap(String userId){  
  19. if(sessionMap.containsKey(userId))  
  20. sessionMap.remove(userId);  
  21. }  
  22.   
  23.   
  24. }  


至于异常的退出,只能等到会话超时了 此时必须设置监听会话超时时session销毁时附带进行的操作 [java] view plaincopyprint?
  1. public class SessionListener implements HttpSessionListener {  
  2. public void sessionDestroyed(HttpSessionEvent sessionEvent){  
  3.       HttpSession session = sessionEvent.getSession() ;  
  4.       SessionManager.removeUserFromSessionMap((String) session.getAttribute("userId"));  
  5.   
  6.   
  7. }  
  8. }  


web.xml中配置 [xhtml] view plaincopyprint?
  1. <listener>  
  2. <listener-class>  
  3. listener.SessionListener   
  4. </listener-class>  
  5. </listener>  
声明:该文观点仅代表作者本人,牛骨文系教育信息发布平台,牛骨文仅提供信息存储空间服务。