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配置 → 框架自定义机制,层层追踪
相关推荐
海兰8 小时前
【数据库】tdsql(mysql8.0)优化思考三
数据库·redis
Bug收容所1 天前
12305项目学习day5
java·spring boot·redis·mysql·spring·rocketmq
智码看视界1 天前
Day33-数据层 × 中间件AI化篇:Redis缓存经典问题-击穿、穿透、雪崩的终极解决方案
数据库·redis·缓存·中间件·穿透·雪崩·击穿
后端观测站1 天前
第九章:Redis 为什么会发生缓存穿透、击穿、雪崩?
redis
海兰2 天前
【高速缓存】RedisVL 存储类型选择指南:Hash 与 JSON
人工智能·redis·算法·缓存·json·哈希算法
Devin~Y2 天前
互联网大厂 Java 面试实录:Spring Boot、MyBatis、Redis、Kafka、Spring Security、RAG 与 MCP 全链路问答
java·redis·kafka·mybatis·spring security·spring mvc·sprint boot
海兰2 天前
【高速缓存】RedisVL 索引迁移指南:安全演进索引结构
前端·数据库·redis·安全·缓存·bootstrap
海兰2 天前
【高速缓存】 RedisVL MCP 运行指南(下)
人工智能·redis·哈希算法·高速缓存
hold?fish:palm2 天前
kv存储主从复制的设计与实现
c++·redis·后端
不如语冰3 天前
AI大模型入门-Python进阶-上下文管理与with语句
开发语言·数据结构·数据库·人工智能·pytorch·redis·python