最近公司开发一个微信小程序项目加shiro的项目。因为微信小程序是不使用cookie,使用的是 storage 。那么我们就不能使用传统的方式来保持登录状态了。

1.首先和网上的一样,先重写一个Session管理器

public class MySessionManager extends DefaultWebSessionManager {
private static final String REFERENCED_SESSION_ID_SOURCE = "Stateless request"; @Override
protected Serializable getSessionId(ServletRequest request, ServletResponse response) {
System.out.println("执行session管理器>>>>>>>>>>>>>>>>>>>>>>>>");
String id = WebUtils.toHttp(request).getHeader("TOKEN");
if(StringUtils.isEmpty(id)){
//如果没有携带id参数则按照父类的方式在cookie进行获取
return super.getSessionId(request, response);
}else{
//如果请求头中有 token 则其值为sessionId
request.setAttribute(ShiroHttpServletRequest.REFERENCED_SESSION_ID_SOURCE,REFERENCED_SESSION_ID_SOURCE);
request.setAttribute(ShiroHttpServletRequest.REFERENCED_SESSION_ID,id);
request.setAttribute(ShiroHttpServletRequest.REFERENCED_SESSION_ID_IS_VALID,Boolean.TRUE);
return id;
}
}

2.将自定义的session管理器交给spring管理

@Configuration
public class ShiroConfig {
@Bean
public DefaultWebSecurityManager securityManager(){
DefaultWebSecurityManager manager = new DefaultWebSecurityManager();
manager.setRealm(realm());
manager.setSessionManager(defaultWebSessionManager());
return manager;
}
@Bean
public DefaultWebSessionManager defaultWebSessionManager(){
MySessionManager manager = new MySessionManager();
return manager;
}
......

到这里看样子似乎是没有什么事情了,但是事与愿违,因为我登陆成功之后,每次都被登录过滤器给拦截了。这是为啥嘞?

经过几轮的debug调试才发现,原来在调用完之后 getSessionId方法之后会有一个设置过期时间的过程(当然这个很正常),默认给设置的是1800,刚开始我觉得没什么毛病啊。就没理他,可是继续往下debug的时候发现报错信息竟然是回话已超时,之后就被登录过滤器给定义为登录失败了(囧)。话说不是已经设置了默认的过期时间了吗? 然后我不服,重写了设置过期时间的方法

 @Override
public void setTimeout(SessionKey key, long maxIdleTimeInMillis) throws InvalidSessionException {
super.setTimeout(key, 3600000);
}

结果就好了。一定要仔细看第二个参数 maxIdleTimeInMillis 这是最大过期时间的毫秒值啊!!!默认给个1800,不就是1.8秒吗?那这样的话想要让这个回话不过期只能自己设置一个比较大的过期时间了,或者你可以做这时间上最快的男人每1.8秒内就请求一次,这样shiro就会重置过期时间。

shiro遇到的坑-重写sessionManager遇到的坑的更多相关文章

  1. SpringBoot2.x整合Shiro出现cors跨域问题(踩坑记录)

    1. Springboot如何跨域? 最简单的方法是: 定义一个配置CorsConfig类即可(是不是简单且无耦合到令人发指) @Configuration public class CorsConf ...

  2. Lombok好用是好用,就是容易踩坑,这份避坑指南请查收

    序言 各位好啊,我是会编程的蜗牛,作为java开发者,我们平常在开发过程中,总是希望能够尽量少敲代码.这一方面,当然是为了偷懒,另一方面,当然也是为了代码看起来更加简洁一点,不断往编程规范上靠.然后其 ...

  3. Uber使用Swift重写APP的踩坑经历及解决方案(转载)

    本文出自Uber移动架构和框架组负责人托马斯·阿特曼于2016年在湾区Swift峰会上的演讲,分享了使用Swfit重写Uber的好与坏.以下为译文: 我是托马斯·阿特曼,目前是Uber移动架构和框架组 ...

  4. shiro-重写标签功能----shiro:hasPermission 标签重写

    public abstract class ShiroAuthorizingRealm extends AuthorizingRealm{ private static final String OR ...

  5. 今天被坑了,而且被坑的好爽! 该死的UTF-8 有 BOM 格式编码

    调一个项目,最后无法登录了. 排查到最后发现是cookie无法保存会话ID, 工作两年的经验这时候没用上. 开始一以为是PHP.ini的配置错了. 考虑过域名,浏览器问题. 脚本BUG. 最后最后一步 ...

  6. 【坑】【数组的坑】1、对象assign复制的假深度,2、数组slice复制的坑,3、还有数组map复制的坑

    1.对象复制的坑 Object.assign() Object.assign() //浅复制 基本没用 跟直接用= 一样 Object.assign(true,{}) // 以为是深拷贝,其实只是一级 ...

  7. Springboot2.x+shiro+redis(Lettuce)整合填坑

    主要记录关键和有坑的地方 前提: 1.SpringBoot+shiro已经集成完毕,如果没有集成,先查阅之前的Springboot2.0 集成shiro权限管理 2.redis已经安装完成 3.red ...

  8. shiro权限管理框架与springmvc整合

    shiro是apache下的一个项目,和spring security类似,用于用户权限的管理‘ 但从易用性和学习成本上考虑,shiro更具优势,同时shiro支持和很多接口集成 用户及权限管理是众多 ...

  9. Spring Boot分布式系统实践【扩展1】shiro+redis实现session共享、simplesession反序列化失败的问题定位及反思改进

    前言 调试之前请先关闭Favicon配置 spring:     favicon:       enabled: false 不然会发现有2个请求(如果用nginx+ 浏览器调试的话) 序列化工具类[ ...

随机推荐

  1. Tomcat启动失败原因: More than one fragment with the name [spring_web] was found. 解决

    将一个eclipse上搭建好的项目移到idea开发时遇到的问题,tomcat启动时报了3个错误 -Nov- :: ms -Nov- ::)-127.0.0.1] org.apache.tomcat.u ...

  2. 剑指offer第40题

    package com.yan.offer; /** * 题目描述: * * 一个整型数组里除了两个数字之外,其他的数字都出现了两次.请写程序找出这两个只出现一次的数字. * * @author Ya ...

  3. kaggle——TMDB 电影票房收入预测

    介绍 看电影是目前人们休闲娱乐,消遣时光的选择之一.我们都知道,有些电影的票房很高,有的电影票房却很低,那么决定票房的因素是什么呢?本次将介绍,如何根据电影上映前的一些信息来预测出该电影的票房. 知识 ...

  4. 实验吧web-易-Forms

    打开网页,查看源码, 第二行,showsource的value是0,我们在查看器中将showsource的value值改为1,然后随便输入一个数,可以看到页面出现 意思就是我们输入的PIN的值应该是代 ...

  5. UML-UML工具与UML蓝图

    1.UML应用场景 1).UML作为草图 2).UML作为蓝图. UML生成java代码(前向工程) java代码生成UML(逆向工程) 2.如果绘制了UML草图,如何在编码后更新该图形? 逆向工程, ...

  6. UML-对象设计要迭代和进化式

    1.在<如何面向对象设计>和<如何进行对象设计?>中,对如何迭代和进化式的设计对象做些总结: 1).轻量+简短 2).快速进入编码+测试 3).不要试图在UML中细化所有事物 ...

  7. AI 领域与概述

    概述 数据分析行业主要的职业发展. 业务:业务分析师.数据产品经理.产品总监 技术:算法师.架构师.研发经理.研发总监 美工:BI工程师 人工智能,是数据分析的子集.人工智能主要包括 语音识别 自然语 ...

  8. Element.shadowRoot

    Element.shadowRoot http://www.zhuyuntao.cn/shadow-dom的样式/ Shadow DOM的样式 我们已经可以使用原生的操作DOM的方式和使用模板的方式来 ...

  9. 基因调控网络 (Gene Regulatory Network) 01

    本文为入门级的基因调控网络文章,主要介绍一些基本概念及常见的GRN模型. 概念:基因调控网络 (Gene Regulatory Network, GRN),简称调控网络,指细胞内或一个基因组内基因和基 ...

  10. 一图解明Android Studio项目文件结构各部分作用

    初学Android在阅读<第一行代码>的时候整理出来的,如果差错恳请指出,不胜感激. 制图不易,转载请标注出处,谢谢.