由于CVE-2024-38816漏洞,紧急升级spring boot版本至3.3.4
springboot2.x的用户请注意:
升级版本
目前该漏洞已经修复,受影响用户可升级到以下版本:
Spring Framework 5.3.x:升级到5.3.41(仅限企业支持)
Spring Framework 6.0.x:升级到6.0.25(仅限企业支持)
Spring Framework 6.1.x:升级到6.1.14或更高版本
安全版本Spring Framework 5.3.41为企业版,未免费开放使用!
因此,springboot2.x的用户只能升级到springboot3.x最新版本。
安全版本6.0.24 和 6.1.13 是springboot3.x使用的版本,springboot3.x的用户只需要将springboot升级到最新版本即可,官方已发布最新版本,如下图所示,springboot3.2以下版本已不再提供更新维护。
升级笔记:
引用1
springboot2.x升级到3.x实战经验总结_springboot2升级到3要做什么处理?-CSDN博客
1. 升级java版本至:21
java原来版本为8,需要升级java17以上版本,才能支持spring boot3的版本
简单查询了一下资料,索性直接升级版本至21
查询内容:
深度解读 JDK 8、JDK 11、JDK 17 和 JDK 21 的区别-CSDN博客
https://timefold.ai/blog/java-21-performance
升级过程参照引用1
2. 升级springboot 版本和依赖包
升级mysql驱动包引用:mysql-connector-j 参照引用1
升级java版本后,升级springboot3的最新稳定版本:3.3.4,升级后发现springframework的版本是6.1.3版本,不符合上面漏洞修复的版。需要手动指定spring的版本为:6.1.14版本在pom配置中添加
<properties>
<java.version>21</java.version>
<spring.version>6.1.14</spring.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jcl</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-expression</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-orm</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aspects</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-messaging</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>${spring.version}</version>
</dependency>
<!-- 其他依赖包 -->
<dependencies>
如果引用了httpclient,版本需要指定为5以上的版本RestTemplate引用了httpclient5
<dependency>
<groupId>org.apache.httpcomponents.client5</groupId>
<artifactId>httpclient5</artifactId>
</dependency>
全文替换:org.apache.http替换为:org.apache.hc.client5.http
RequestConfig requestConfig = RequestConfig.custom()
//替换成新的
.setConnectionRequestTimeout(Timeout.ofMilliseconds(5*1000))
.setResponseTimeout(Timeout.ofMilliseconds(5*1000))
// 原来的 设置连接超时时间(单位毫秒)
//.setConnectTimeout(5000)
// 设置请求超时时间(单位毫秒)
//.setConnectionRequestTimeout(5000)
// socket读写超时时间(单位毫秒)
//.setSocketTimeout(5000)
// 设置是否允许重定向(默认为true)
.setRedirectsEnabled(true).build();
httpclient5 忽略证书 替换
/*SSLConnectionSocketFactory scsf = new SSLConnectionSocketFactory(SSLContexts.custom().loadTrustMaterial(null, new TrustSelfSignedStrategy()).build(),NoopHostnameVerifier.INSTANCE);
//CloseableHttpClient httpClient = HttpClientBuilder.create().build();
CloseableHttpClient httpClient = HttpClients.custom().setSSLSocketFactory(scsf).build();*/
//httpclient5 访问https,忽略证书替换为
CloseableHttpClient httpClient = HttpClients.custom()
.setConnectionManager(PoolingHttpClientConnectionManagerBuilder.create()
.setSSLSocketFactory(SSLConnectionSocketFactoryBuilder.create()
.setSslContext(SSLContextBuilder.create()
.loadTrustMaterial(TrustAllStrategy.INSTANCE)
.build())
.setHostnameVerifier(NoopHostnameVerifier.INSTANCE)
.build())
.build())
.build();
httpclient5升级可以参考https://www.cnblogs.com/milton/p/17017446.html
2、javax.servlet包替换为jakarta.servlet
项目全局替换:javax.servlet替换为jakarta.servlet
项目全局替换:javax.persistence替换为jakarta.persistence
项目全局替换:javax.transaction替换为 jakarta.transaction
3、缓存配置修改
<!--<dependency>
<groupId>net.sf.ehcache</groupId>
<artifactId>ehcache</artifactId>
<dependency>-->
<dependency>
<groupId>org.ehcache</groupId>
<artifactId>ehcache</artifactId>
</dependency>
4、RestTemplate配置
@Bean
public RestTemplate restTemplate() {
HttpComponentsClientHttpRequestFactory httpRequestFactory = new HttpComponentsClientHttpRequestFactory();
httpRequestFactory.setConnectionRequestTimeout(60*1000);
httpRequestFactory.setConnectTimeout(60*1000);
//httpRequestFactory.setReadTimeout(60*1000); 新版本中没有此方法
return new RestTemplate(httpRequestFactory);
}
6、logback配置修改
https://blog.csdn.net/u013737132/article/details/14306428277
7 打包jar时报错了
发现要下载新eclipse。并且需要修改maven配置文件,记得把maven的setting.conf配置文件改成21版本的。
<profile>
<!--<id>jdk-1.8</id>
<activation>
<activeByDefault>true</activeByDefault>
<jdk>1.8</jdk>
</activation>
<properties>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
<maven.compiler.compilerVersion>1.8</maven.compiler.compilerVersion>
</properties>-->
<id>jdk21</id>
<activation>
<activeByDefault>true</activeByDefault>
<jdk>21</jdk>
</activation>
<properties>
<maven.compiler.source>21</maven.compiler.source>
<maven.compiler.target>21</maven.compiler.target>
<maven.compiler.compilerVersion>21</maven.compiler.compilerVersion>
</properties>
</profile>