项目要求同一个账户只能在一处登录,如果同时登陆了就把前一个登录的踢掉。
1.首先在你的controller中定义两个参数
// 用户和Session绑定关系
public static final Map<String, HttpSession> USR_SESSION = new HashMap<String, HttpSession>();
// SessionId和用户的绑定关系
public static final Map<String, String> SESSIONID_USR = new HashMap<String, String>();
因为用户登录成功后,用户的数据是放在Session中保管的,所以要保存session与用户的关系及sessionId与用户的关系。
当用户登录后,我们要把用户数据放到session之前检查一下当前用户是否登录 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", "您的账号已经在另一处登录了,您被迫下线!");
}
}
如果用户已登录,则将用户与session及sessionid与用户关系的两个参数中相关数据通过key的形式清掉,并且向这个session发送消息。
3.前台页面接收消息
由于jsp中获取session不能实时更新,所以我们需要写个定时js方法,不断去获取session的数据
在页面标签添加onload事件绑定checkLogin方法
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"));
}
因为我们登录用户的时候做了第二步的操作,所以这边我们调用后台的时候可以取到session中msg的数据,如果有msg则你被别人顶掉了。需要重新登录。