Java连接Redis

完整问题总结(含Spring Boot)

一、问题场景

你需要在 Spring Boot + 若依框架 项目中,通过HTTP接口测试Redis连接是否正常。


二、涉及的Spring Boot核心组件

组件 作用
Spring Boot Test 提供测试环境,但你需要通过HTTP测试
Spring Boot Web 提供Controller支持,暴露HTTP接口
Spring Boot Data Redis 提供 StringRedisTemplate 操作Redis
Spring Security 认证授权框架,默认拦截所有请求
Spring Boot Autoconfigure 自动配置Redis、Security等

三、问题演进路径

第一阶段:单元测试阶段

java 复制代码
@SpringBootTest  // Spring Boot测试注解
public class RedisConnectionTest {
    @Autowired
    private StringRedisTemplate redisTemplate;  // Spring Boot自动配置
    
    @Test
    public void testRedis() { /* 测试逻辑 */ }
}

问题 :@SpringBootTest 加载完整应用上下文时,因数据源配置缺失报错 Could not resolve placeholder 'spring.datasource.druid.initialSize'

原因:Spring Boot测试会加载所有自动配置,包括数据源,但测试环境缺少完整配置。

解决方案:

  • 复制完整配置文件到 src/test/resources/
  • 或使用 @DataRedisTest 只加载Redis相关配置
  • 或在 @SpringBootTest 中排除数据源自动配置

第二阶段:HTTP接口测试阶段

java 复制代码
@RestController  // Spring MVC注解
public class RedisConnectionTest {
    @Autowired
    private StringRedisTemplate redisTemplate;  // Spring Bean注入
    
    @GetMapping("/testRedisConnection")
    public void testRedis() { /* 测试逻辑 */ }
}

问题 :访问 http://localhost:8080/testRedisConnection 返回401

原因:Spring Security默认拦截所有请求,需要认证。


第三阶段:Spring Security放行尝试

尝试方案 使用的Spring技术 结果
@PermitAll JSR-250标准注解 ❌ 需要启用 jsr250Enabled
@PreAuthorize("permitAll()") Spring Security注解 ❌ JWT过滤器先拦截
SecurityConfig 配置放行 Spring Security配置 ❌ 若依框架有自定义机制
JWT过滤器硬编码放行 Spring Web过滤器 ❌ 请求虽然放行但后续仍被拦截

✅ 最终解决方案:@Anonymous

java 复制代码
import com.zy.btld.common.annotation.Anonymous;

@RestController
public class RedisConnectionTest {
    
    @GetMapping("/testRedisConnection")
    @Anonymous  // ✅ 若依框架提供的注解
    public void testRedisConnection() {
        // 使用Spring Data Redis操作
    }
}

四、Spring Boot + 若依框架的权限控制流程

scss 复制代码
用户请求 /testRedisConnection
        ↓
[Spring Boot Web] DispatcherServlet 接收请求
        ↓
[Spring Security 过滤器链] 
    ├── CorsFilter (跨域处理)
    ├── JwtAuthenticationTokenFilter (JWT验证) 
    │   └── 检查是否为放行URL → 是 → 放行
    ├── UsernamePasswordAuthenticationFilter
    └── 其他过滤器
        ↓
[Spring Security 权限检查]
    ├── 读取 PermitAllUrlProperties 中的放行列表
    │   └── 包含 @Anonymous 注解的URL
    └── 允许匿名访问
        ↓
[Spring MVC] Controller方法执行
    └── 使用 StringRedisTemplate 操作Redis

五、关键Spring组件详解

1. @SpringBootTest

java 复制代码
@SpringBootTest(classes = {BTLDApplication.class, TestConfig.class})
  • 作用:启动完整的Spring应用上下文进行测试
  • 问题:会加载所有自动配置,可能导致配置冲突

2. StringRedisTemplate

java 复制代码
@Autowired
private StringRedisTemplate redisTemplate;
  • 来源 :spring-boot-starter-data-redis 自动配置
  • 作用:操作Redis的String类型数据
  • 配置 :读取 application.yml 中的 spring.redis.* 配置

3. @EnableMethodSecurity

java 复制代码
@EnableMethodSecurity(prePostEnabled = true, securedEnabled = true, jsr250Enabled = true)
  • 作用:启用方法级别的权限控制
  • 相关注解 :
    • @PreAuthorize - 需要 prePostEnabled=true
    • @Secured - 需要 securedEnabled=true
    • @PermitAll - 需要 jsr250Enabled=true

4. SecurityFilterChain

java 复制代码
@Bean
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception
  • 作用:配置Spring Security的过滤器链
  • 关键配置 :
    • .permitAll() - 放行特定URL
    • .authenticated() - 需要认证
    • .addFilterBefore() - 添加自定义过滤器

六、最终答案

组件 配置/代码
依赖 spring-boot-starter-data-redis
配置 application.yml 中的 spring.redis.*
注解 @Anonymous(若依框架)
测试接口 GET /testRedisConnection
结果 控制台输出 value值:test 和 ✅ 连接成功

七、核心经验

  1. Spring Boot自动配置是把双刃剑:方便开发,但测试时需要排除无关配置
  2. Spring Security的过滤器链有顺序:JWT过滤器在权限检查之前,需要提前放行
  3. 框架规范优先于标准注解 :若依框架用 @Anonymous,而非Spring标准的 @PermitAll
  4. 排查要逐层深入:从过滤器 → Security配置 → 框架自定义机制,层层追踪
相关推荐
aiks_yuan2 小时前
Token 放 Redis 还是用 JWT:Java 实测验签和查 Redis 耗时,退出登录、改密码踢下线怎么做(jjwt 0.12 + Redis 7.2)
redis
我不会起名字3229 小时前
Redis 从 0 到 1(二十九):CPU 突然 100%——commandstats 定位法与 6 步排查链路
redis·cpu·慢查询·排查·commandstats
我不会起名字32210 小时前
Redis 从 0 到 1(二十八):Redis 抖一下,重试把它打挂了——超时/重试/熔断的 Go 封装
redis·go·超时·熔断·重试
我不会起名字32211 小时前
Redis 从 0 到 1(三十):删了一半数据 RSS 不降——内存碎片与 activedefrag 观测
redis·内存碎片·rss·排查·activedefrag
csdn_aspnet1 天前
使用 Docker 和 RedisInsight 设置 Redis 以进行本地开发
redis·docker·容器·redisinsight
用户094248568031 天前
第22章:Redis 持久化 RDB 与 AOF:数据不丢的底线
redis·架构·源码
没有气的汽水1 天前
升级完客户端,redis 又开始大量返回 MOVED:一个埋了七个月的本地配置
redis
csdn_aspnet1 天前
如何在本地 Docker 容器中运行 Redis,并使用 Redis Insight 和 Redis CLI 进行管理
redis·docker·容器
IT规划师2 天前
Redis 数据类型全解 - Bitfield:99% 开发者没用过的位域操作,把内存再砍 80%(七)
redis·bitfield·位域