shiro中session的共享问题与完成前后端权限的校验

目录

1.shiro中session的共享问题

1.2 如何解决session共享问题

2. 解决前端不支持cookie的效果

2.1 如何把sessionId放入请求头。

2.2 重写DefaultWebSessionManager的方法

3. 设置前端前置路由守卫

4. 如何防止恶意重复登录

5. 退出

6. 获取当前登录用户的信息


 

1.shiro中session的共享问题

 

 

演示问题:

(1)启动shiro-springboot的集群项目

 

 

(2)修改nginx的配置

 

(3)使用Swage测试

 

登录成功后访问某些资源时,出现了未登录的json提示

 

1.2 如何解决session共享问题

默认session存储再各自服务的内存中,可以让session统一存储再redis中。

疯狂的蛋糕的依赖。---提供了redis存储session的类。

修改shiro的配置类。

 

 

2. 解决前端不支持cookie的效果

 

原因: 默认DefaultWebSessionManager它只接受Cookie中存储的JsessionId. 查询发现再redis中不存在对应的key.

如何解决:

 

客户发送请求时,再请求头中携带sessionId, 然后重写DefaultWebSessionManager中getSessionId()的方法。

思考:1. 如何把sessionId放入请求头。

2. 重写getSessionId方法如何获取请求头的sessionID。

2.1 如何把sessionId放入请求头。

修改登录的接口

 

修改前端登录方法

 

修改main.js文件

 

2.2 重写DefaultWebSessionManager的方法

public class MyWebSessionManager extends DefaultWebSessionManager {
    private static final String AUTHORIZATION = "token";
    private static final String REFERENCED_SESSION_ID_SOURCE = "Stateless request";
    protected Serializable getSessionId(ServletRequest request, ServletResponse response) {
        //获取请求头中名称为token的内容
        String id = WebUtils.toHttp(request).getHeader("token");
        if (!StringUtils.isEmpty(id)) { //如果存在该token
            request.setAttribute(ShiroHttpServletRequest.REFERENCED_SESSION_ID_SOURCE, "Stateless request");
            request.setAttribute(ShiroHttpServletRequest.REFERENCED_SESSION_ID, id);
            request.setAttribute(ShiroHttpServletRequest.REFERENCED_SESSION_ID_IS_VALID, Boolean.TRUE);
            return id;
        } else {
            //从cookie中获取sessionId.
            return super.getSessionId(request, response);
        }
    }
}

修改shiro配置类

 

修改shiroFilter过滤器

我们发现跨域请求,会发送两个请求:第一个OPTIONS请求,第二个请求是真实的请求。

OPTIONS请求:先头部队。

所以我们对OPTIONS请求都要放行。

 

3. 设置前端前置路由守卫

 

4. 如何防止恶意重复登录

 

5. 退出

编辑退出接口

 

编辑前端退出按钮

 

6. 获取当前登录用户的信息

 

前端

 

至此全部完成

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值