解决 Java 17 , Springboot 3.0, Shiro 框架无法使用的问题。

解决 Java 17 , Springboot 3.0, Shiro 框架无法使用的问题。

本文解决了在 Java 17 环境下,Spring Boot 3.0 与 Shiro 框架因 Servlet 兼容性问题而无法正常使用的问题。问题的根源在于 Spring Boot 3.0 引入了 Servlet 5.0,因此将原本的 `javax.servlet` 替换为 `jakarta.servlet`,导致传统基于 `javax.servlet` 的 Shiro 版本失效,即便尝试强制引入 `javax.servlet` 也无效。 为了应对这一兼容性挑战,Shiro 发布了兼容 `jakarta` 的新版全家桶。开发者只需在项目中替换相关依赖即可。对于 Gradle 用户,可直接引入 `shiro-spring` 和 `shiro-web` 的 `jakarta` 版本,并正确排除旧模块;而 Maven 用户需导入带有 `jakarta` 标识的相关依赖模块。项目中其余基于 Shiro 的实现代码无需改动,可以平稳完成升级。 这种解决方法提供了当下对 Shiro 框架问题的最优解,也为开发者解决类似的问题提供了参考。详细配置与实践可参考 Shiro 官方文档及相关示例代码。

解决 Java 17 , Springboot 3.0, Shiro 框架无法使用的问题。

Shiro(全名Apache Shiro)是一个用于Java应用程序的强大且易于使用的安全性框架。它的主要目标是简化应用程序的身份验证(Authentication)、授权(Authorization)、会话管理和加密等安全性相关的任务。Shiro的设计理念是提供一个轻量级、直观和容易集成的安全框架,可以用于各种Java应用,包括Web应用、命令行应用和分布式系统等。

106977130_p0_master1200.jpg

1. 原因

"Springboot3.0 Shiro 失效。"

由于在 Java 17 下的 Springboot 3.0 使用了 Servlet 5.0 为了避免 Oracle 版权问题而从 javax.Servlet 更换成的 jakarta.Servlet。

导致了基于 javax.Servlet 的 Shiro 框架无法使用 (即使强行引入 java.Servlet,也依然会出现失效问题)

2. 解决方法

实际上 Shiro 在之后提供了兼容 jakarta 版本的 Shiro 全家桶。

我们可以通过以下方式,替换掉原来基于 javax.Servlet 的 Shiro 来解决这个问题.

Gradle ( 已测试 ):

    implementation('org.apache.shiro:shiro-spring:1.11.0:jakarta') { 
        exclude group: 'org.apache.shiro', module: 'shiro-web' 
    }
    implementation 'org.apache.shiro:shiro-web:1.11.0:jakarta'

Maven:

        <dependency>
            <groupId>org.apache.shiro</groupId>
            <artifactId>shiro-core</artifactId>
            <classifier>jakarta</classifier>
        </dependency>
        <dependency>
            <groupId>org.apache.shiro</groupId>
            <artifactId>shiro-web</artifactId>
            <classifier>jakarta</classifier>
        </dependency>

        <dependency>
            <groupId>org.apache.shiro</groupId>
            <artifactId>shiro-spring-boot-web-starter</artifactId>
            <classifier>jakarta</classifier>
        </dependency>
        <dependency>
            <groupId>org.apache.shiro</groupId>
            <artifactId>shiro-spring-boot-starter</artifactId>
            <classifier>jakarta</classifier>
        </dependency>
        <dependency>
            <groupId>org.apache.shiro</groupId>
            <artifactId>shiro-spring</artifactId>
            <classifier>jakarta</classifier>
        </dependency>

注意 : 换成新的 Shiro 后 只需要将导入的包替换为 jakarta 即可。之前的内容并不需要更改。

3. 参考资料

  1. https://github.com/apache/shiro/issues/891
  2. https://github.com/apache/shiro/blob/main/samples/web-jakarta/pom.xml
评论