// 用戶和Session綁定關系
public static final Map USR_SESSION = new HashMap();
// SessionId和用戶的綁定關系
public static final Map SESSIONID_USR = new HashMap();
因為用戶登錄成功后,用戶的數據是放在中保管的,所以要保存與用戶的關系及與用戶的關系。
當用戶登錄后,我們要把用戶數據放到之前檢查一下當前用戶是否登錄 ps:這步是實現踢掉用戶的關鍵
2.檢查當前用戶是否登錄
/**
*
* 用戶登錄時的處理
*
* @param request
*
*/
public static void userLoginHandle(HttpServletRequest request) {
// 當前登錄的用戶
String userName = request.getParameter("userName");
// 當前sessionId
String sessionId = request.getSession().getId();
// 刪除當前sessionId綁定的用戶,用戶--HttpSession
USR_SESSION.remove(SESSIONID_USR.remove(sessionId));
// 刪除當前登錄用戶綁定的HttpSession
HttpSession session = USR_SESSION.remove(userName);
if (session != null) {
SESSIONID_USR.remove(session.getId());
session.setAttribute("msg", "您的賬號已經在另一處登錄了,您被迫下線!");
}
}
如果用戶已登錄,則將用戶與及與用戶關系的兩個參數中相關數據通過key的形式清掉,并且向這個發送消息。
3.前臺頁面接收消息
由于jsp中獲取不能實時更新java踢出已登錄用戶,所以我們需要寫個定時js方法,不斷去獲取的數據
在頁面標簽添加事件綁定方法
function checkUserOnline(){
$.ajax({
type:"POST",
url:"/gangcheng/login/checkUserOnline",
data:{},
success: function(data){
msg = data;
}
});
if(msg=='null'||msg==''|| msg == 'undefined'){
return;
}else{
alert(msg);
提示完信息后,調用你的注銷用戶方法
}
}
function checkLogin(){
check = setInterval("checkUserOnline()",500);
}
調用的后臺方法如下
/**
* 判斷用戶是否同時登陸同一個用戶
*
* */
@RequestMapping(value="/checkUserOnline")
@ResponseBody
public void checkUserOnline(HttpServletRequest request,HttpServletResponse response) throws IOException{
HttpSession session=request.getSession();
PrintWriter out = response.getWriter();
out.print(session.getAttribute("msg"));
}
因為我們登錄用戶的時候做了第二步的操作,所以這邊我們調用后臺的時候可以取到中msg的數據,如果有msg則你被別人頂掉了。需要重新登錄。
到這里如果沒有看懂的話,建議你跟著我的步驟java踢出已登錄用戶,一步一步copy,完事之后再去自己理解,這個方法有一個缺陷的地方就是同一個瀏覽器,是一樣的,就會只能記錄一個最近登錄的用戶,前面你登錄過的用戶就不會再被頂掉了,一般項目是不會有同一個人同時登陸兩個用戶的情況。如果會有這種情況,那么這種方法不適合你,你需要自己再改動改動