近期项目被扫描出关于spring framework路径遍历漏洞(cve-2024-38816),客户要求整改,查了下springboot2需要升级到5.3.40才可以,但springboot2好像不太能很快就升级,或者有可能不再会升级了,因此直接就将springboot升级到3了,本想着万年jdk8,但springboot3不支持jdk8,看样子要打破了,因此利用周末做了一下升级测试,记录如下:
以下为我进行springboot2升级到springboot3过程相关修改记录,备查,你的项目不一定用到下面所有的,可以参考着改
主要修改
jdk升级
按springboot3要求,升级到jdk17或jdk21,我这边是升级到jdk17
spring-boot-starter-parent
spring-boot-starter-parent依赖版本升级
升级前
<parent> <groupid>org.springframework.boot</groupid> <artifactid>spring-boot-starter-parent</artifactid> <version>2.7.18</version> <relativepath /> <!-- lookup parent from repository --> </parent>
升级后
<parent> <groupid>org.springframework.boot</groupid> <artifactid>spring-boot-starter-parent</artifactid> <version>3.4.0</version> <relativepath /> <!-- lookup parent from repository --> </parent>
jdk源码编码修改,将1.8改成17或21
修改前
<build> <plugins> <plugin> <groupid>org.apache.maven.plugins</groupid> <artifactid>maven-compiler-plugin</artifactid> <configuration> <source>1.8</source> <target>1.8</target> </configuration> </plugin> </plugins> </build>
修改后
<build> <plugins> <plugin> <groupid>org.apache.maven.plugins</groupid> <artifactid>maven-compiler-plugin</artifactid> <configuration> <source>17</source> <target>17</target> </configuration> </plugin> </plugins> </build>
javax.servlet.*相关的类找不到,需要切换依赖为jakarta.servlet
<!--jakarta.servlet start --> <dependency> <groupid>jakarta.servlet</groupid> <artifactid>jakarta.servlet-api</artifactid> </dependency> <!--jakarta.servlet end -->
同时,将所有javax.servlet.*修改为jakarta.servlet.*
另外校验类相关的也进行修改javax.validation.*修改为jakarta.validation.*
mybatis-plus-boot-starter升级
mybatis-plus-boot-starter需要升级,不升可能会报invalid value type for attribute ‘factorybeanobjecttype’: java.lang.string,需要升级一下依赖
升级成:
mybatis-plus-spring-boot3-starter
,我使用的是3.5.5
<!-- mybatis-plus start--> <dependency> <groupid>com.baomidou</groupid> <artifactid>mybatis-plus-spring-boot3-starter</artifactid> <version>3.5.5</version> </dependency> <!-- mybatis-plus end-->
redis修改
配置上需要加上data
需要修改redis的配置:由原来的spring.redis.修改为spring.data.redis.
改完后重启又发现如下错误:
unable to make field private final byte[] java.lang.string.value accessible: module java.base does not “opens java.lang” to unnamed module @2bbaf4f0
原因是redission版本比较低,我升级版本后就没问题了
升级前版本:<redisson.version>3.12.5</redisson.version>
升级后版本:<redisson.version>3.40.2</redisson.version>
swagger升级到springboot3
<swagger3.version>2.7.0</swagger3.version>
<!-- swagger3 start --> <dependency> <groupid>org.springdoc</groupid> <artifactid>springdoc-openapi-starter-webmvc-ui</artifactid> <version>${swagger3.version}</version> </dependency> <!-- swagger3 end -->
swagger3默认是开启了接口和doc的访问的如引入上面的依赖后,可以通过如下地址访问(假如端口为8080,context-path为/test)
http://localhost:8080/test/swagger-ui/index.html http://localhost:8080/test/v3/api-docs
注:如果生产环境中需要禁用,使用如下配置进行,分别进行ui的禁用和api-docs的禁用
springdoc: swagger-ui: enabled: true api-docs: enabled: true
其他修改参考
如果用到了阿里巴巴druid数据源,最好升级到新版本
我这里是从druid的1.2.12版本升级到了1.2.24
注:我使用的是编程式的阿里巴巴的监控配置,webstatfilter和statviewservlet的实现类需要修改,如果不是用编程式,可以不用管这一步
import com.alibaba.druid.support.jakarta.webstatfilter; import jakarta.servlet.annotation.webfilter; import jakarta.servlet.annotation.webinitparam; //注意不要忘记在 springbootsampleapplication.java 上添加 @servletcomponentscan 注解,不然就是404了。 @webfilter( filtername = "druidwebstatfilter", urlpatterns = "/*", initparams = { @webinitparam(name = "exclusions", value = "weburi.json,.html,.js,.gif,.jpg,.png,.css,.ico,/druid/*") // 忽略资源 }) public class druidstatfilter extends webstatfilter { }
import com.alibaba.druid.support.jakarta.statviewservlet; import jakarta.servlet.annotation.webinitparam; import jakarta.servlet.annotation.webservlet; //注意不要忘记在 springbootsampleapplication.java 上添加 @servletcomponentscan 注解,不然就是404了。 @webservlet(urlpatterns="/druid/*", initparams={ @webinitparam(name="allow",value=""),// ip白名单(没有配置或者为空,则允许所有访问) @webinitparam(name="deny",value=""),// ip黑名单 (存在共同时,deny优先于allow) @webinitparam(name="loginusername",value="admin"),// 用户名 @webinitparam(name="loginpassword",value="123456"),// 密码 @webinitparam(name="resetenable",value="true")// 启用html页面上的“reset all”功能 }) public class druidstatviewservlet extends statviewservlet { private static final long serialversionuid = -2688872071445249539l; }
localvariabletableparameternamediscoverer类找不到
springboot3中没有这个类了,需要修改成org.springframework.core.standardreflectionparameternamediscoverer
到此这篇关于springboot2升级到springboot3过程相关修改的文章就介绍到这了,更多相关springboot2升级到springboot3内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论