SpringBoot Shiro 多用户登录控制及同一浏览器登录多个账号 session相互覆盖问题

SpringBoot Shiro 框架实现同一个浏览只能一个账号登录

问题点:

同一个浏览器上登录多个三员账号,后登陆的会覆盖前面的session,但是前面的页面没有退出(后续请求使用的是后登录的用户的session),导致日志记录等获取的当前操作主体不准确

解决:

在 login 方法中加入以下方法

  Subject subject = SecurityUtils.getSubject();
if(subject.getPrincipal()!= null){
    String msg2= "同一个浏览器同时只能一个账号登录,请退出前一个账号后再重试";
    return  ResultResponseUtil.error(msg2);
}

SpringBoot Shiro 框架同一浏览器三员先后登录打开多个页签,session 覆盖问题
问题点:

界面菜单未刷新(cookie 存储的最后一个登录的用户信息),导致界面日志查询等操作的角色后台获取与前端不一致,数据展示异常

解决

Index.html 首页

function checkUserRole(){
    let username =  $("#username").val();
    setInterval(function () {
        $.ajax({
            url: "/public/checkRole",
            type: "get",
            data: {"username":$("#username").html()},
            success: function (result) {
                if (("fail" == result)) {
                    window.location.href = "/public/index";
                }
            },
            error: function (data) {
                toastr.error("网络错误,请重试", "错误提示");
            }
        })
    },5000)
};



//会话失效退出
timer = null;
window.onmousemove = function() {
    let onlineTime = 0;
    clearTimeout(timer);
    timer = setTimeout(function(){
        window.location="/public/logout";
    }, 1000 * 60);
}

后台接口

@GetMapping("/checkRole")
@ResponseBody
public String checkRole(HttpServletRequest request){
    String res = "fail";
    String userName =  request.getParameter("username");

    if(SecurityUtils.getSubject() !=null && SecurityUtils.getSubject().getPrincipal()!= null ){
        User user = (User)SecurityUtils.getSubject().getPrincipal();
        if(user.getUsername().equals(userName)){
            res = "suc";
        }
    }
    return res;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值