单点登录大概逻辑梳理

本文介绍了单点登录的实现逻辑,包括维护一个Map集合来保存sessionId,实现HttpSessionListener监听session销毁,以及创建Filter拦截请求进行登录状态判断。通过这种方式,当用户在不同终端登录时,旧的登录会话将被强制下线。文中还提供了具体的思路和步骤,以及相关配置代码示例。
摘要由CSDN通过智能技术生成

在用户登录时一起将sessionid传进去,记录到数据库

再加一个接口去获取用户ID(唯一)对应的sessionID

在之后跳转或者刷新页面时调用这个接口判断当前sessionID和存储到数据库的sessionID是否是同一个。不是同一个跳转到登录页面,重新登录。是就可以进入界面

还有一种逻辑是只做在后端,参考下面这个连接

JavaWeb-实现限制单个账号多处登录_咕噜咕噜da的博客-CSDN博客_java实现多点登录

知识点

思路如下:

流程图

 

演示

具体实现:
1.维护一个map集合

public class LoginUserMap {
    private static Map<String, String> loginUserMap = new ConcurrentHashMap<String, String>();
    /**
     * set方法
     *
     * @param loginId   用户唯一标识,用户名或者用户Id
     * @param sessionId sessionId
     */
    public static void setLoginUserMap(String loginId, String sessionId) {
        loginUserMap.put(loginId, sessionId);
    }
    /**
     * get方法
     *
     * @return
     */
    public static Map<String, String> getLoginUserMap() {
        return loginUserMap;
    }
    /**
     * 根据sessionId移除map中的值
     *
     * @param sessionId
     */
    public static void removeUser(String sessionId) {
        for (Map.Entry<String, String> entry : loginUserMap.entrySet()) {
            if (sessionId.equals(entry.getValue())) {
                loginUserMap.remove(entry.getKey());
                break;
            }
        }
    }
    /**
     * 判断用户是否在map中
     *
     * @param loginId
     * @param sessionId
     * @return
     */
    public static boolean isInLoginUsers(String loginId, String sessionId) {
        return (loginUserMap.containsKey(loginId) && sessionId.equals(loginUserMap.get(loginId)));
    }

2.实现一个session监听,session销毁能及时更新map

@WebListener
public class SessionListener implements HttpSessionListener {
    private Logger logger=LoggerFactory.getLogger(SessionListener.class);
    @Override
    public void sessionCreated(HttpSessionEvent httpSessionEvent) {

    }
    @Override
    public void sessionDestroyed(HttpSessionEvent httpSessionEvent) {
        HttpSession session = httpSessionEvent.getSession();
        String sessionId &#
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值