一、原理
自定义一个全局Map(单例类),将用户的loginPk作为key,sessionId作为value。当用户访问需用权限访问的页面时,比较当前session的id与原map中的sessionId是否相等:不相等,则已在另一地点登录。然后用cookie设置一标志位,表示是否单点登录。当跳出来时,再在页面判断cookie的值,然后显示信息。
二、代码
1、自定义类UserContext.java
package com.society.tool;
import java.util.concurrent.ConcurrentHashMap;
import javax.servlet.http.HttpSession;
/**
* 单点登录类
*
* @author liyulin lyl010991@126.com
* @version 1.0 2015-06-04
*/
public class UserContext {
private static final ConcurrentHashMap<String, String> concurrentHashMap = new ConcurrentHashMap<String, String>();
private volatile static UserContext userContext = new UserContext();
private UserContext() {
}
public static UserContext getInstance() {
return userContext;
}
public ConcurrentHashMap<String, String> getConcurrentHashMap(){
return concurrentHashMap;
}
/**
* 判断用户是否已经登录
*
* @param sessionId
* @param loginPk
* @return boolean 该用户是否已经登录过的标志
*/
public static boolean isLogined(String sessionId, String loginPk) {
boolean flag = false;
// 如果该用户已经登录过,则使上次登录的用户掉线
if (concurrentHashMap.containsKey(loginPk)) {
flag = true;
} else {
flag = false;
}
concurrentHashMap.put(loginPk, sessionId);
return flag;
}
/**
* session销毁
*
* @param loginPk
*/
public void sessionDestroyed(String loginPk) {
concurrentHashMap.remove(loginPk);
}
}
2、登录成功后:
UserContext.getInstance().isLogined(session.getId(), String.valueOf(map.get("pk")));
3、过滤器拦截
boolean isMorePointLogined = false;
Object type = session.getAttribute("contactType");
String oldSessionId = null;
String newSessionId = session.getId();
if(type!=null){
oldSessionId = UserContext.getInstance().getConcurrentHashMap().get(session.getAttribute("loginPk"));
if(!newSessionId.equals(oldSessionId)){
isMorePointLogined = true;
}
}
4、过滤器跳转
// 非管理员身份不能进入后台界面
if(isMorePointLogined){
// 设置多点登录的状态 ===> 在index.jsp页面提示
Util.setCookie(httpServletResponse, "isMorePointLogined", Config.MorePointLoginSatus.TRUE);
}
httpServletResponse.sendRedirect(httpServletRequest.getContextPath() + "/index.jsp");
5、jsp页面
if(tool.getCookie("isMorePointLogined")==='<%=com.society.tool.Config.MorePointLoginSatus.TRUE%>'){
steveAl('您的账号在异地登录!已被迫下线!', 3000);
tool.delCookie("isMorePointLogined");
}