序言
在github上搜索redisson官方源码中的issue其他伙伴们提交的记录。
https://github.com/spring-projects/spring-data-redis/tree/main/src/main/java/org/springframework/data/redis/connection/zset
基础工程的pom文件中的依赖结构
springboot version
<dependency><groupld>org.springframework.boot</groupld><artifactld>spring-boot-starter</artifactld><version>2.7.13</version><scope>compile</scope>
</dependency>
redis version 继承了 springboot version
<dependency><groupld>org.springframework.boot</groupld><artifactld>spring-boot-starter-data-redis</artifactld>
</dependency>
mvn clean --> mvn verify/package/install 对maven工程进行打包操作
spring.profile.active=环境名 (dev、test、druid等) 指定特定环境的application.yml配置文件启动升级版本后的错误在上面的issue中描述的现象。
在导入redisson-spring-boot-starter3.22.0版本项目启动过程中throws this exception
│ 2023-08-09 15:32:04.819 ERROR 1 --- [ main] o.s.boot.SpringApplication : Application run failed │
│ │
│ org.springframework.context.ApplicationContextException: Failed to start bean 'redisPubsubContainer'; nested exception is java.lang.NoClassDefFoundError: org/springframework/data/redis/connection/zset/Tuple │
│ at org.springframework.context.support.DefaultLifecycleProcessor.doStart(DefaultLifecycleProcessor.java:181) ~[spring-context-5.3.28.jar:5.3.28] │
│ at org.springframework.context.support.DefaultLifecycleProcessor.access$200(DefaultLifecycleProcessor.java:54) ~[spring-context-5.3.28.jar:5.3.28] │
│ at org.springframework.context.support.DefaultLifecycleProcessor$LifecycleGroup.start(DefaultLifecycleProcessor.java:356) ~[spring-context-5.3.28.jar:5.3.28] │
│ at java.base/java.lang.Iterable.forEach(Iterable.java:75) ~[na:na] │
│ at org.springframework.context.support.DefaultLifecycleProcessor.startBeans(DefaultLifecycleProcessor.java:155) ~[spring-context-5.3.28.jar:5.3.28] │
│ at org.springframework.context.support.DefaultLifecycleProcessor.onRefresh(DefaultLifecycleProcessor.java:123) ~[spring-context-5.3.28.jar:5.3.28] │
│ at org.springframework.context.support.AbstractApplicationContext.finishRefresh(AbstractApplicationContext.java:937) ~[spring-context-5.3.28.jar:5.3.28] │
│ at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:586) ~[spring-context-5.3.28.jar:5.3.28] │
│ at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:147) ~[spring-boot-2.7.13.jar:2.7.13] │
│ at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:731) ~[spring-boot-2.7.13.jar:2.7.13] │
│ at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:408) ~[spring-boot-2.7.13.jar:2.7.13] │
│ at org.springframework.boot.SpringApplication.run(SpringApplication.java:307) ~[spring-boot-2.7.13.jar:2.7.13] │
│ at io.tolgee.Application$Companion.main(Application.kt:52) ~[app/:na] │
│ at io.tolgee.Application.main(Application.kt) ~[app/:na] │
│ Caused by: java.lang.NoClassDefFoundError: org/springframework/data/redis/connection/zset/Tuple │
│ at org.redisson.spring.data.connection.RedissonConnection.<clinit>(RedissonConnection.java:2361) ~[redisson-spring-data-31-3.23.2.jar:3.23.2] │
│ at org.redisson.spring.data.connection.RedissonConnectionFactory.getConnection(RedissonConnectionFactory.java:113) ~[redisson-spring-data-31-3.23.2.jar:3.23.2] │
│ at org.springframework.data.redis.listener.RedisMessageListenerContainer$Subscriber.initialize(RedisMessageListenerContainer.java:1186) ~[spring-data-redis-2.7.13.jar:2.7.13] │
│ at org.springframework.data.redis.listener.RedisMessageListenerContainer.doSubscribe(RedisMessageListenerContainer.java:318) ~[spring-data-redis-2.7.13.jar:2.7.13] │
│ at org.springframework.data.redis.listener.RedisMessageListenerContainer.lazyListen(RedisMessageListenerContainer.java:295) ~[spring-data-redis-2.7.13.jar:2.7.13] │
│ at org.springframework.data.redis.listener.RedisMessageListenerContainer.lazyListen(RedisMessageListenerContainer.java:265) ~[spring-data-redis-2.7.13.jar:2.7.13] │
│ at org.springframework.data.redis.listener.RedisMessageListenerContainer.start(RedisMessageListenerContainer.java:249) ~[spring-data-redis-2.7.13.jar:2.7.13] │
│ at org.springframework.context.support.DefaultLifecycleProcessor.doStart(DefaultLifecycleProcessor.java:178) ~[spring-context-5.3.28.jar:5.3.28] │
│ ... 13 common frames omitted │
│ Caused by: java.lang.ClassNotFoundException: org.springframework.data.redis.connection.zset.Tuple │
│ at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:602) ~[na:na] │
│ at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:178) ~[na:na] │
│ at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:522) ~[na:na] │
│ ... 21 common frames omitted
分析过程
1、redisson-spring-boot-starter1.18.0升级方案
SpringBoot Version
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.7.3</version><type>pom</type><scope>import</scope>
</dependency>
redis-boot-starter version
<dependency><groupld>org.springframework.boot</groupld><artifactld>spring-boot-starter-data-redis</artifactld>
</dependency>
redisson-spring-boot-starter version
<dependency><groupId>org.redisson</groupId><artifactId>redisson-spring-boot-starter</artifactId><version>3.18.0</version>
</dependency>
这种 redisson-spring-boot-starter3.18.0发布到服务器上部署时进行漏洞扫描组件时发现因为版本号低了无法通过漏洞扫描检测,要求至少要达到redisson-spring-boot-starter3.22.0版本号。
springboot2.x在装配redisson兼容的最高版本3.18.0。在3.18.0以后版本编译过程就会出错。
2、redisson3.22.0
<dependency><groupId>org.redisson</groupId><artifactId>redisson</artifactId><version>3.22.0</version>
</dependency>
导入redisson、redis-spring-boot-starter、spring-boot-starter依赖编译打包后运行maven主启动类后报错:
Caused by: org.springframcwork.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'org.redisson.api.RedissonClient" available: eq
at org.springframework.beans.factory.support.DefaultListableBeanFactory.raiseNMatchingBean
解决方案
3、在redisson-spring-boot-starter3.22.0依赖中redisson-spring-data 是 redisson-spring-data-31子依赖不能兼容spring-boot-starter-parent2.7.3版本,需要排除 redisson-spring-data-31,引入 redisson-spring-data-27依赖。
pom文件中升级依赖的版本
<dependency><groupld>org.redisson</groupld><artifactld>redisson-spring-boot-starter</artifactid><version>3.22.0</version>
<exclusions><exclusion><groupld>org.redisson</groupld><artifactld>redisson-spring-data-31</artifactid></exclusion>
</exclusions>
</dependency>
<dependency><groupld>org.redisson</groupld><artifactld>redisson-spring-data-27</artifactld><version>3.22.0</version>
</dependency>
第三种方式符合代码在服务器上部署时漏洞扫描组件要求依赖版本号至少要达到预期的版本。
小结
通过redisson-spring-boot升级3.22.0版本组件扫描是一种漏洞扫描。漏洞扫描是一种自动化的安全测试方法,用于检测计算机系统、网络和应用程序中的漏洞和安全缺陷。漏洞扫描工具会对系统进行自动化的测试,以发现可能存在的安全漏洞和缺陷,如密码弱、SQL注入、跨站脚本攻击等。漏洞扫描工具会模拟攻击者的攻击行为,对系统中的漏洞进行探测和测试,以帮助管理员或开发人员识别和修复系统中的漏洞。
代码漏洞扫描过程中发现redisson-spring-boot-starter低版本漏洞。
漏洞扫描的目的:
发现安全漏洞和缺陷
漏洞扫描可以帮助企业或组织发现其系统、网络或应用程序中可能存在的安全漏洞和缺陷,如密码弱、SQL注入、跨站脚本攻击等。
评估安全风险
漏洞扫描可以帮助企业或组织评估其系统、网络或应用程序的安全风险,以便采取相应的安全措施和调整安全策略。
提高安全性和可靠性
及时修复漏洞和缺陷可以提高系统的安全性和可靠性,防止安全事故和数据泄露等不良后果。
遵守法规和标准
许多法规和标准要求企业或组织对其系统、网络或应用程序进行安全测试和评估,漏洞扫描可以帮助企业或组织遵守相关法规和标准的要求。
参考附录
[1] https://blog.csdn.net/weixin_42555971/article/details/136732270 [N]
[2] https://www.ithere.net/article/1663178340985024513 [N]
[3] https://github.com/redisson/redisson [S]
[4] https://cloud.tencent.com/developer/techpedia/1773 [N]