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

关于防止一个账号在不同机器上重复登录

创建时间:2017-04-24 投稿人: 浏览次数:151

需求:同一个账号,比如在a电脑登录,b就不能登录,主管理员可以踢掉任何人下线。

1.SessionListener.java 文件


package com.neusoft.core;


import java.util.HashMap;


import javax.servlet.http.HttpSession;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;


/**       
 * 项目名称:diablo   
 * 类名称:SessionListener   
 * 创建人:极限李。   
 * 创建时间:2017年4月21日 下午4:50:12   
 * @version       
 */
public class SessionListener implements HttpSessionListener{
public static HashMap<String,String> userMap = new HashMap<String,String>();  
 
    public static HashMap<String,HttpSession> sessionMap = new HashMap<String,HttpSession>();
@Override
public void sessionCreated(HttpSessionEvent httpSessionEvent) {
// TODO Auto-generated method stub

}


@Override
public void sessionDestroyed(HttpSessionEvent httpSessionEvent) {
// TODO Auto-generated method stub
HttpSession session = httpSessionEvent.getSession();  
        String sessionId = session.getId();  
        sessionMap.remove(sessionId);  
        for(String key : userMap.keySet()){  
            if(userMap.get(key).equals(sessionId)){  
                userMap.remove(key);  
            }  
        }  
}


}


2.web.xml

<listener>  
    <listener-class>com.neusoft.core.SessionListener</listener-class>  
</listener>


3.登录controller

String userName = user.getUserName();
String sessionid = SessionListener.userMap.get(userName);  
System.out.println("sessionid  "+sessionid);
if(sessionid != null&&!sessionid.equals("")){
   //注销在线用户,如果session id 相同,不销毁。  
System.out.println("sessionid不为空");
System.out.println("request.getSession().getId() "+request.getSession().getId());
   /*if(!sessionid.equals(request.getSession().getId())){  
       SessionListener.sessionMap.get(sessionid).invalidate();  
       SessionListener.userMap.put(userName,request.getSession().getId());  
       SessionListener.sessionMap.put(request.getSession().getId(),request.getSession());  
   }*/  
String message="此账号已经登录";
model.addAttribute("message", message);
return "redirect:/login.do";
}else{ 
System.out.println("sessionid为空");
   if(SessionListener.sessionMap.containsKey(request.getSession().getId())){
    System.out.println("执行删除sessionMap");
       SessionListener.sessionMap.remove(request.getSession().getId());  
       for(String key : SessionListener.userMap.keySet()){  
           if(SessionListener.userMap.get(key).equals(request.getSession().getId())){
            System.out.println("执行删除userMap");
               SessionListener.userMap.remove(key);  
           }  
       }  
   }  
   SessionListener.userMap.put(userName,request.getSession().getId());  
   SessionListener.sessionMap.put(request.getSession().getId(),request.getSession());
   queryList();
   return "redirect:/main.do";


4.查询当前所有用户

public List<String> queryList(){  
       HashMap<String,HttpSession> sessionMap = SessionListener.sessionMap; 
       System.out.println(sessionMap);
       System.out.println(sessionMap.size());
       System.out.println(sessionMap.toString());
       System.out.println(sessionMap.keySet());
       
       List<String> list = new ArrayList<String>();  
       System.out.println("SessionListener.userMap.keySet()"+SessionListener.userMap.keySet());
       for(String key : SessionListener.userMap.keySet()){
        System.out.println("key  "+key);
           OnlineVo v = new OnlineVo();  
           v.setLoginname(key);  
           System.out.println("v.getLoginname()  "+v.getLoginname());
           list.add(v.getLoginname());  
       }  
       System.out.println("list"+list);
       return  list;  
   }  


 5.执行踢出用户和用户自己点退出或者关闭游览器

@RequestMapping("/addUser.do")
public ModelAndView addUser(){
ModelAndView modelAndView=new ModelAndView("user/UserAdd");
queryList();
List<String> queryList = queryList();
modelAndView.addObject("queryList", queryList);
return modelAndView;

}
@RequestMapping(value="/xiaxian", method = RequestMethod.GET)  
    public String getNewForm(HttpServletRequest request){
String user = request.getParameter("user");
System.out.println("user  "+user);
String sessionid = SessionListener.userMap.get(user);  
System.out.println("sessionid  "+sessionid);

   //注销在线用户,如果session id 相同,不销毁。  
System.out.println("开始去除sessionid");
System.out.println("request.getSession().getId() "+request.getSession().getId());
HttpSession httpSession = SessionListener.sessionMap.get(sessionid);
System.out.println("httpSession  "+httpSession);
SessionListener.userMap.remove(user);
httpSession.invalidate();
// SessionListener.sessionMap.remove(sessionid);
       
/*        SessionListener.userMap.put(user,request.getSession().getId());  
       SessionListener.sessionMap.put(request.getSession().getId(),request.getSession());*/  
String zhiling = request.getParameter("zhiling"); 
System.out.println("zhiling "+zhiling);
if(zhiling.equals("xiaxian")){
return "redirect:addUser.do";
}else{
return "redirect:/login.do";
}

}


6.jsp 自己点退出,或者关闭浏览器,或者关机,

<button onclick="tuichu()">退出</button>
function tuichu(){
    alert("进入退出");
    var yonghu = $("#yonghu").text();
    var zhiling="tuichu";
  var stt="user/xiaxian.do?user=" + yonghu +"&zhiling="+zhiling;
  window.location.href=stt;
    } 
    /* window.onbeforeunload = onbeforeunload_handler; */  
       window.onunload = onunload_handler;  
       /* function onbeforeunload_handler(){  
           var warning="确认退出?"; 
           return warning;
       } */  
         
       function onunload_handler(){  
           /* var warning="谢谢光临"; */  
          /*  alert(warning); */  
           var yonghu = $("#yonghu").text();
    var zhiling="tuichu";
  var stt="user/xiaxian.do?user=" + yonghu +"&zhiling="+zhiling;
  window.location.href=stt;
       }  



7.踢人下线

<table  id="table" class="gridtable" border="1">
<tr>
<th width="5%">用户名</th>
<th width="5%">操作</th>
</tr>

<c:forEach items="${queryList}" var="queryList">
<tr>  
  <td>${queryList}</td>
  <td><a style="color:blue;cursor:pointer;" onclick="updateRow(this); " >修改</a></td>
  </tr>
  </c:forEach>


</table>
function updateRow(r){
    var zhiling="xiaxian";
    var i=r.parentNode.parentNode.rowIndex;
    alert("行号"+i);
    var bb= document.getElementById("table").rows[i].cells[0].innerText;
    alert(bb);
    var stt="xiaxian.do?user=" + bb +"&zhiling="+zhiling;
    //alert(stt);
    window.location.href=stt;
    }


声明:该文观点仅代表作者本人,牛骨文系教育信息发布平台,牛骨文仅提供信息存储空间服务。