一、原理
1. 异地登陆
同一个账号,在不同的电脑(也可以不同的浏览器)登陆系统,前一个已经登陆的账号session被销毁,用户进行下一步操作时跳转错误页面。
2. 超时登陆
登陆后无操作*分钟后自动销毁session,用户进行下一步操作时跳转错误页面。
3. 区分
异地登陆和超时登陆起效时跳转的错误页面不相同。
二、实现
1. 超时登陆
由系统控制,在web.xml中配置,或者由监听器控制,利用session.setMaxInactiveInterval(interval);方法控制,本次主要展示在web.xml中配置的方法,如下:
30
2. 异地登陆
首先在Controller中判断登陆用户的账号密码是否正确,通过以后判断session是不是异地登陆(过程在监听器中判断,此处判断监听器处理后的返回值),如果是,session销毁,如下:
@RequestMapping("/loginCheck")
@ResponseBody
public Map loginCheck(HttpServletRequest request, String userLoginNumber, String userLoginPasswd) {
Map ret = new HashMap(2);// 存储错误信息的Map容器
String errorMsg = "";// 错误信息
HttpSession session = request.getSession();
/*
代码块,判断账号,并给errorMsg赋值或不赋值(正确)
*/
if (/* 账户判断成功,没有错误信息 */) {
/*
监听器实现HttpSessionListener和HttpSessionAttributeListener接口。
监听器private static一个Map类型的变量。
当监听到对Attribute操作时(登陆验证成功向session添加用户数据,一般都会用到),进入
HttpSessionAttributeListener.attributeAdded()方法,向公共map变量放入数据。
当监听到session销毁操作时,进入HttpSessionListener.sessionDestroyed()方法,将公共map
里的值移除。
LoginListenner.isLogonUser()就是得到map中存储的值
*/
HttpSession isLoginSession = LoginListenner.isLogonUser(userLoginNumber);
if (null != isLoginSession) {// 如果没有,则当前session是一个新的session,之前的session已经销毁
// 异地登陆: 在监听器中区分超时和异地登陆, 在拦截器中判断
isLoginSession.setAttribute("sessionDestroyedStatus", "busy");
isLoginSession.invalidate();// 表示异地登陆,销毁session
}
ret.put("result", "1");
}
return ret;
}
监听器实现(原理在上面),包括区分异地登陆和超时登陆需要跳转不同页面的处理,过程如下:
import java.util.HashMap;
import java.util.Map;
import javax.servlet.http.HttpSession;
import javax.servlet.http.HttpSessionAttributeListener;
import javax.servlet.ht