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配置 → 框架自定义机制,层层追踪
相关推荐
小小工匠2 天前
Redis - 事务机制:能实现 ACID 属性吗
数据结构·redis·性能优化·并发·持久化
taocarts_bidfans2 天前
反向海淘跨境缓存架构优化:taocarts Redis分层缓存实战技术
redis·缓存·架构·反向海淘·taocarts
炘爚2 天前
Linux——Redis
数据库·redis·缓存
csjane10792 天前
Redisson 限流原理
java·redis
ThanksGive2 天前
Go 服务里的 Redis 锁惊群问题:一次本地合流优化实践
redis
小挪号底迪滴2 天前
Redis 和 MySQL 数据不一致怎么办?缓存更新策略实战
redis·mysql·缓存
闪电悠米2 天前
黑马点评-Redis ZSet-实现关注 Feed 流
服务器·网络·数据库·redis·缓存·junit·lua
Devin~Y2 天前
大厂 Java 面试实录:从音视频内容社区到 AI RAG 的全链路技术设计
java·spring boot·redis·spring cloud·微服务·kafka·音视频