防止重复登录

防止重复登陆的思路就是:判断session中用户的值(比如;用户名、用户id等)是否存在,如果存在,则提示用户此账户已登陆,类似QQ的重复登陆功能。

实现如下:(此类已经在项目中运行,代码拷贝至实际的项目,稍微修改即可)

①SessionListener,该listener实现 HttpSessionListener接口

 

  1.  import  javax.servlet.http.*;    
  2. import  java.util.*;   
  3.  
  4.  
  5. public  class  SessionListener  implements  HttpSessionListener{  
  6.    @SuppressWarnings("unchecked")  
  7. private  static  java.util.Hashtable  hUserName  =  new   Hashtable();  
  8.    public  void  sessionCreated(HttpSessionEvent  se){  
  9.          System.out.println( "客户端已连接服务器 --会话号为: " + se);  
  10.     }  
  11.  
  12.    public  void  sessionDestroyed(HttpSessionEvent  se){  
  13.            hUserName.remove(se.getSession());  
  14.            System.out.println( "用户会话已失效session -- " + se);  
  15.     }  
  16.  
  17.    @SuppressWarnings("unchecked")  
  18. public  synchronized  static  boolean  isLogined(HttpSession  session,String  user_id1,String user_name){//(踢掉先登陆者再抢)是否该帐户已经在使用Action调用  
  19.        boolean  flag  =   false;  
  20.        if(hUserName.containsKey(user_id1)){  
  21.                              flag  =   true;  
  22.                              HttpSession  vsession  =  (HttpSession)hUserName.get(user_id1);  
  23.                              try   {  
  24.                                  vsession.invalidate();//踢掉先登陆者  
  25.                                  System.out.println("用户 - " + user_name + " || 已存在 - " +session);  
  26.                                  System.out.println("用户 - " + user_name + " || 被挤掉了");  
  27.                              }  
  28.                              catch  (Exception   ex){}  
  29.                      }  
  30.        else{  
  31.                flag  =   false;  
  32.                  
  33.        }  
  34.        hUserName.remove(user_id1);  
  35.        hUserName.remove(user_name);  
  36.        if(flag==false){//如果没有登陆则在哈西表中记录  
  37.        hUserName.put(user_id1,session);  
  38.        System.out.println("用户已经登陆: - " + user_name + " || 会话号为: - " +session);  
  39.        }  
  40.        return   flag;  
  41.     }  

②登陆Action调用如下:

 

  1. public String userLogin() {  
  2.  
  3.         String username = "";  
  4.         String realname = "";  
  5.         try {  
  6.  
  7.             listAllUser = userService.userLogin(user.getUsername(), Password  
  8.                     .createPassword(getPassword()));  
  9.  
  10.         } catch (Exception e) {  
  11.             e.printStackTrace();  
  12.         }  
  13.         Iterator<OrderUser> rs = listAllUser.iterator();  
  14.         HttpSession session = ServletActionContext.getRequest().getSession();  
  15.         if (listAllUser.size() != 0) {  
  16.             while (rs.hasNext()) {  
  17.                 OrderUser user = rs.next();  
  18.                 session.setAttribute("username", user.getUsername().toString()  
  19.                         .trim());  
  20.                 session.setAttribute("realname", user.getName().toString()  
  21.                         .trim());  
  22.                 session.setAttribute("id", user.getId().toString().trim());  
  23.                 Timestamp d = new Timestamp(System.currentTimeMillis());  
  24.                 user.setLoginTime(d);  
  25.                 userService.update(user);  
  26.                 System.out.println("MD5验证4" 
  27.                         + Password.authenticatePassword(user.getPassword(),  
  28.                                 getPassword()));  
  29.                 username = user.getUsername().toString().trim();  
  30.                 realname = user.getName().toString().trim();  
  31.                 // 判断是否冻结账户  
  32.                 if (user.getStatus().equals("冻结")) {  
  33.                     return "dongjie";  
  34.                 }  
  35.                 // }else{  
  36.                 // return SUCCESS;  
  37.                 // }  
  38.  
  39.             }  
  40.               
  41.             boolean flag = SessionListener.isLogined(session, username,  
  42.                     realname);  
  43.               
  44.             if (flag == true) {  
  45.                 return "isloged";  
  46.             } else {  
  47.                 System.out.println("用户正常登陆");  
  48.             }  
  49.  
  50.             return SUCCESS;  
  51.         } else {  
  52.  
  53.             return INPUT;  
  54.         }  
  55.  
  56.     } 

③web.xml配置部分如下:

 

  1. <listener> 
  2.         <listener-class>com.yaxing.util.SessionListener</listener-class> 
  3.     </listener> 

④struts.xml配置部分如下:

 

  1. <action name="userLogin" class="userBean" method="userLogin"> 
  2.             <result name="success">/web/Index.html</result> 
  3.             <result name="input">/web/loginFailure.jsp</result> 
  4.             <result name="dongjie">/web/dongjie.jsp</result> 
  5.                     <result name="isloged">/web/loged.jsp</result> 
  6.         </action> 

⑤提示js 如下:

 

  1. <body> 
  2.     <script type="text/javascript"> 
  3.          alert("你的账号已经登录!");  
  4.           
  5.     </script> 
  6.     <%   
  7.         response.setHeader("refresh","0;URL = ../web/Index.html");    
  8.         %>   
  9.      
  10.   </body> 

 

本文出自 “幽灵柯南的技术blog” 博客,请务必保留此出处http://enetq.blog.51cto.com/479739/702256

猜你喜欢

转载自weihong01267.iteye.com/blog/2372242