SpringBoot3整合Shiro未生效问题
问题描述
在使用 SpringBoot3.1.0 对 Shiro 进行整合后,无法生效
版本:
SpringBoot:3.1.0 / 3.0.6
shiro-spring-boot-web-starter:2.0.0-alpha-2 / 1.4.0
JDK:17
其他无关紧要,上面版本两两组合都无法生效,项目启动正常,但是请求始终无法拦截认证
然而在将 SpringBoot 版本降为 2.7.10 后,Shiro 就可以正常使用了
因此怀疑又是 SpringBoot3 升级导致的问题
毕竟有前车之鉴 —— SpringBoot3.0.6 中存在当项目所在路径有空格时无法注入的问题(在 SB3.1.0 中修复了,实际上就是对 Unicode 编码解析的问题)
问题原因
说回整合 Shiro 的问题,既然是 SB 升级后导致的,那自然就要看看是什么问题了
在对 SB2.7.10 和 SB3.1.0 获取请求后的操作中发现,在 2.7.10 中请求正常走进了 Shiro 的 Filter 中(org.apache.shiro.web.servlet.OncePerRequestFilter)
然而 SB3 并没有进入,并且,在 SB3 依赖中打开这个 Filter 竟然爆红了
明显看出,就是这个包出问题了,而且很眼熟 —— 这个不就是 Tomcat 的包吗
再看下 SB3 依赖的 Tomcat:
原来改名字了,我也记得以前遇到过 SB2 升级到 SB3 要改名的问题
问题解决
直到原因 —— Tomcat 包下的类路径改名了 —— 就好办了
引入没有改名的对应的 Tomcat 就可以了
<dependency>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-core</artifactId>
<version>9.0.74</version>
</dependency>
引入后运行 SB3 ,Shiro 完美生效了
此方法不可行,之前验证的项目错了,真正能够解决的方法参考博客:
原文链接:https://blog.csdn.net/weixin_43492211/article/details/131217344
此处贴上我参考上述博客处理后的 Demo 的完整 POM 文件
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>3.1.0</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.banmao</groupId>
<artifactId>testShiro</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>testShiro</name>
<description>testShiro</description>
<properties>
<java.version>17</java.version>
<shiro.version>1.4.0</shiro.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.apache.shiro</groupId>
<artifactId>shiro-spring</artifactId>
<classifier>jakarta</classifier>
<version>1.11.0</version>
<!-- 排除仍使用了javax.servlet的依赖 -->
<exclusions>
<exclusion>
<groupId>org.apache.shiro</groupId>
<artifactId>shiro-core</artifactId>
</exclusion>
<exclusion>
<groupId>org.apache.shiro</groupId>
<artifactId>shiro-web</artifactId>
</exclusion>
</exclusions>
</dependency>
<!-- 引入适配jakarta的依赖包 -->
<dependency>
<groupId>org.apache.shiro</groupId>
<artifactId>shiro-core</artifactId>
<classifier>jakarta</classifier>
<version>1.11.0</version>
</dependency>
<dependency>
<groupId>org.apache.shiro</groupId>
<artifactId>shiro-web</artifactId>
<classifier>jakarta</classifier>
<version>1.11.0</version>
<exclusions>
<exclusion>
<groupId>org.apache.shiro</groupId>
<artifactId>shiro-core</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>