private static final String LOGIN_USER=“username”;
public void attributeAdded(HttpSessionBindingEvent hs) {
//属性监听器在使用session.setAttribute()时触发,判断用户时候重复登陆,或者异地登陆,需要过去用户名,这个时候用它是适合的
// // TODO Auto-generated method stub
String att=hs.getName();//获取属性名。当属性名为 用户名的时候,执行以下:
if(LOGIN_USER.equals(att)) {
String username=(String)hs.getValue();//获取属性值
HttpSession session=hs.getSession();//获取setAttribute 方法的 session对象
String sessionID=session.getId();
System.out.println(session.getId());
String sessionID2=LoginCache.getInstance().getSessionIdByUserName(username);//自定义LoginCache 类,用于保存数据,代码在下面:
if(null==sessionID2) {
System.out.println("第一次登陆");
}else {
我们需要通过从表单中传过来的用户名来获取session,但是,我们我们需要通过sessionId是否存在这个属性来判断是否是同一个用户,如果在异地登陆的时候,通过用户名,可能判断是否为重复登陆,只需要看session是否为空即可,但是想要剔除之前的登陆,需要通过sessionID来获取之前的登陆,因为不同的浏览器 同一个账号sessionid不同,我们需要根据这个属性来区分当前登录和先前的登陆,从而剔除先前的session,而不是全部剔除。即通过用户名直接获取,会得到两个session
这种方法可以剔除先前的登陆,清除之前的session,结合过滤器,可以将对方挤下线。
System.out.println("第二次登陆");
HttpSession session2 = LoginCache.getInstance().getSessionBySessionId(sessionID2);//获取前次该用户登录对应的session对象
System.out.println(session2.getId());
session2.invalidate();//清除之前的登陆session
}
LoginCache.getInstance().setSessionIdByUserName(username, sessionID);
LoginCache.getInstance().setSessionBySessionId(sessionID, session);
}
//Logincahe类代码
public class LoginCache {
private static LoginCache instance=new LoginCache() ;
public static LoginCache getInstance(){
return instance;
}
public LoginCache() {
}
private Map<String,String> loginUserSessionId=new HashMap<String,String>();
private Map<String,HttpSession> loginSession=new HashMap<String,HttpSession>();
public String getSessionIdByUserName(String usename) {
return loginUserSessionId.get(usename);
}
public HttpSession getSessionBySessionId(String sessionId) {
return loginSession.get(sessionId);
}
public void setSessionIdByUserName(String username,String sessionId) {
loginUserSessionId.put(username,sessionId);
}
public void setSessionBySessionId(String sessionId, HttpSession session) {
loginSession.put(sessionId,session );
}
}