原理:
- 用户A使用账号a在浏览器当中登录,然后用户B在另外一台电脑上的浏览器登录账号a,当用户B登录验证成功时,将会触
发登录监听类,在监听类当中判断出账号a已经被用户A登录,就把用户A的账号a 踢出去,此时当用户A操作页面,页面就会跳转到
登录页面。
代码实现:
- 在实现过程中,用到LoginListenner监听类、login登录方法以及在web.xml中配置监听类
- 当登录成功后,向session中放入登录成功的账号对象loginuser,触发LoginListenner中的attributeAdded事件,在这个事件中,
我们判断存放账号和session对应关系的map中是否有当前登录的账号的session,如果有我们就把该session从map中移除,同时注
销该session,然后把刚登录的账号和session放入map。
代码:package com.jk.util;
import java.util.HashMap;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import javax.servlet.http.HttpSessionAttributeListener;
import javax.servlet.http.HttpSessionBindingEvent;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import com.jk.entity.CodePw;
import com.sun.xml.bind.v2.runtime.Location;
/**
*
* <pre>项目名称:spring-mybatis
* 类名称:LoginListenner
* 类描述: 登录监听类-处理同一时间只允许账号,单地点登录
* 创建人:
* 创建时间:2016年10月29日 上午10:44:50
* 修改人:
* 修改时间:2016年10月29日 上午10:44:50
* 修改备注:
* @version </pre>
*/
public class LoginListenner implements HttpSessionAttributeListener {
/**
* 用于存放账号和session对应关系的map
*/
private Map<String, HttpSession> map = new HashMap<String, HttpSession>();
/**
* 当向session中放入数据触发
*/
public void attributeAdded(HttpSessionBindingEvent event) {
String name = event.getName();
System.err.println(name);
if (name.equals("adminUser")) {
CodePw user = (CodePw) event.getValue();
if (map.get(user.getUsercode()) != null) {
HttpSession session = map.get(user.getUsercode());
session.removeAttribute(user.getUsercode());
session.invalidate(); // 使得 session 失效
}
map.put(user.getUsercode(), event.getSession());
}
}
/**
* 当向session中移除数据触发
*/
public void attributeRemoved(HttpSessionBindingEvent event) {
String name = event.getName();
if (name.equals("adminUser")) {
CodePw user = (CodePw) event.getValue();
map.remove(user.getUsercode());
}
}
public void attributeReplaced(HttpSessionBindingEvent event) {
}
public Map<String, HttpSession> getMap() {
return map;
}
public void setMap(Map<String, HttpSession> map) {
this.map = map;
}
}
登录方法
web.xml
<!--一个用户只能在一个主机登录 -->
<listener>
<listener-class>com.test.util.LoginListenner</listener-class>
</listener>
<!-- 一个用户只能在一个主机登录 end-->