session单点登录的实现

一、原理

    自定义一个全局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");
}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值