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;
}