实现QQ在别处登录,被迫下线
httpSession绑定,为每个登录用户绑定一个sessionid,放到map集合中
当用户重复登录时,将map中对应的user删除,再删除session中的user
或者在表中定义一个boolean型的status,当用户第一次登录时,将status值设为false。
实现:
1,创建servletContextListener,当服务器运行时,创建一个Map集合
?Map<String,HttpSession> sessionMap = new HashMap<String,HttpSession>();
?将sessionMap放入ServletContext作用域中
?servletContext.setAttribute("sessionMap",sessionMap);
在web.xml中配置servletContextListener
2,用户登录
获取表单参数loginName,password
获得servletContext上下文
sessionMap = request.getSession.getServletContext().getAttribute(sessionMap);
获得httpSession
currentSession = request.getSession();
判断数据库中是否存在该用户是否合法
user = userService.load(loginName,password)
if(user!=null){//合法用户
?if(!sessionMap.containKey(loginName)){//如果sessionMap没有loginName关联的session说明用户未登录
??currentSession.setAttribute("user",user)
??sessionMap.put("loginName",currentSession)
??return mapping.findForword("success")
?}else{//存在对应的session,先将先登录的session删掉再将现在用户的currentSession放到servletContext作用域中
??//1,删除操作
??HttpSession session sessionMap.get("loginName")
??session.remove("user")
??sessionMap.remove("loginName")
??//2,增加操作
??currentSession.setAttribute("user",)
??sessionMap.put("loginName",currentSession)
??return mapping.findForword("success")
?}
}
request.setAttribute("errorMessage","登录名或密码错误")
return mapping.findForword("error")
3,用Ajax与Jquery实现动态刷新,验证该用户是否在别处登录(仿造QQ,用户在别处登录,被迫下线)
validate.jsp
<script language="javascript" src="jquery.js">
<script>
??? function refresh(){
???????? var url = "${basePath}/userAction.do?method=validate&t="+new Date()//
???????? $.get(url,null,function(relogin){
?if("relogin".equals(relogin)){
??$("#messageArea").html("您的QQ在别处登录,被迫下线")
?}?
????????? });
?? }?
?? window.setInterval("refresh",3000)//每隔3秒调用refresh方法
</script>
<body>
<p id="messageArea"></p>
</body>
UserAction中的validate()
sessionMap = request.getSession().getServletContext().getAttribute("sessionMap")
currentSession = request.getSession();
if(currenSession==null){//如果当前用户没有session,即在别处登录
?response.getWriter.writer("relogin")
}
return null
缺陷:此为B/S结构,无状态的连接,无法实时响应服务器,而且在登录后的每个页面动态刷新(性能太差,或许也可以定义frameset,将动态刷新放置top.jsp中,但是会在main.jsp中出现404错误,如果是用struts2实现,可以用拦截器,当用户再次发动请求,转至login.jsp),动态提示该用户是否在别处登录,只是模仿QQ的功能,如果有不正确的地方,或者有更好的见解,请指正。