目录
2.2 重写DefaultWebSessionManager的方法
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. 获取当前登录用户的信息
前端
至此全部完成