spring boot 14

一、SpringBoot 集成 Redis 步骤

1. 引入依赖

pom.xml 中添加 Redis 起步依赖:

xml

复制代码
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
  • groupIdorg.springframework.boot,标识 Spring 官方项目组
  • artifactIdspring-boot-starter-data-redis,Redis 集成的起步依赖,自动引入相关客户端和配置

2. 配置 Redis 连接信息

application.yml 中配置 Redis 连接参数:

yaml

复制代码
spring:
  data:
    redis:
      host: localhost  # Redis 服务器地址
      port: 6379       # Redis 默认端口
      # password: 你的密码  # 可选,有密码时配置
      # database: 0       # 可选,指定使用的数据库编号,默认0

3. 核心 API:StringRedisTemplate

SpringBoot 自动配置了 StringRedisTemplate,专门用于字符串类型的 Redis 操作,常用方法:

java

运行

复制代码
@Autowired
private StringRedisTemplate stringRedisTemplate;

// 1. 存储字符串
@Test
public void testSet() {
    stringRedisTemplate.opsForValue().set("username", "如花");
}

// 2. 获取字符串
@Test
public void testGet() {
    String value = stringRedisTemplate.opsForValue().get("username");
    System.out.println(value); // 输出:如花
}

// 3. 带过期时间的存储(如令牌场景)
stringRedisTemplate.opsForValue().set("token:1001", "abc123", 30, TimeUnit.MINUTES);

二、基于 Redis 的令牌主动失效机制

1. 核心目标

解决传统 Token 无法主动失效的问题,实现修改密码、退出登录后,旧令牌立即失效的安全控制。

2. 完整流程

  1. 登录阶段:令牌存入 Redis 用户登录成功后:

    • 生成唯一令牌(Token)
    • 将令牌响应给前端(通常放在响应头 / 响应体中)
    • 同时将令牌存入 Redis,Key 为 token:用户ID,Value 为令牌值,并设置过期时间(如 30 分钟)

    示例代码:

    java

    运行

    复制代码
    // 登录成功逻辑
    String token = UUID.randomUUID().toString();
    // 存入Redis,设置30分钟过期
    stringRedisTemplate.opsForValue().set("token:" + userId, token, 30, TimeUnit.MINUTES);
    // 响应给前端
    return Result.success(token);
  2. 请求阶段:拦截器验证令牌 自定义 LoginInterceptor 拦截所有请求,执行以下验证逻辑:

    • 从请求头中获取前端携带的令牌
    • 从 Redis 中取出该用户对应的令牌(通过用户 ID 解析 Key)
    • 比较两个令牌是否一致:
      • 一致:放行请求,刷新 Redis 中令牌的过期时间
      • 不一致 / Redis 中不存在:拒绝请求,返回 "未登录 / 令牌已失效"

    示例代码:

    java

    运行

    复制代码
    public class LoginInterceptor implements HandlerInterceptor {
        @Autowired
        private StringRedisTemplate stringRedisTemplate;
    
        @Override
        public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
            // 1. 获取请求头中的token
            String token = request.getHeader("token");
            if (token == null || token.isEmpty()) {
                response.setStatus(401);
                return false;
            }
    
            // 2. 解析用户ID(示例:假设token中包含用户ID,实际可通过JWT解析)
            String userId = parseUserIdFromToken(token);
            // 3. 从Redis中获取存储的token
            String redisToken = stringRedisTemplate.opsForValue().get("token:" + userId);
    
            // 4. 验证token是否一致
            if (redisToken == null || !redisToken.equals(token)) {
                response.setStatus(401);
                return false;
            }
    
            // 5. 刷新过期时间
            stringRedisTemplate.expire("token:" + userId, 30, TimeUnit.MINUTES);
            return true;
        }
    }
  3. 主动失效阶段:删除 Redis 中的令牌 当用户执行修改密码、退出登录等操作时,直接删除 Redis 中对应的令牌:

    java

    运行

    复制代码
    // 修改密码成功后
    stringRedisTemplate.delete("token:" + userId);
    
    // 退出登录时
    stringRedisTemplate.delete("token:" + userId);

    此时前端携带的旧令牌,在下次请求时会被拦截器验证失败,实现主动失效。


三、关键知识点补充

1. 为什么要用 Redis 实现令牌主动失效?

  • 传统无状态 Token(如 JWT)依赖客户端过期,服务器无法主动控制,存在安全风险(如用户修改密码后,旧 Token 仍可使用)
  • Redis 是高性能内存数据库,读写速度快,支持设置过期时间,适合存储临时令牌
  • 通过 Redis 统一管理令牌,服务器可以随时删除令牌,实现主动失效控制

2. 令牌存储设计建议

  • Key 设计token:用户ID,方便快速定位和删除
  • 过期时间:设置合理的过期时间(如 30 分钟),避免 Redis 内存占用过高
  • 刷新机制:每次请求成功后刷新过期时间,实现 "登录态续期"

3. 注意事项

  • 拦截器需要配置 excludePathPatterns 放行登录、注册等无需验证的接口
  • Redis 需配置持久化(如 RDB/AOF),避免重启后令牌丢失导致用户全部掉线
  • 生产环境中,建议对 Redis 连接配置密码和 SSL,提升安全性
相关推荐
llz_1124 小时前
web-第四次课后作业
前端·spring boot·web
一杯奶茶¥5 小时前
基于springboot的失物招领管理系统带万字文档 校园失物招领管理系统 失物认领管理系统java springboot vue
java·vue.js·spring boot·java项目
不能只会打代码5 小时前
边缘视频分析平台的架构设计与性能优化——从750ms到190ms的调优之路
java·spring boot·redis·性能优化·边缘计算·物联网竞赛
xufengzhu8 小时前
第三方 Python 库 redis-py + hiredis 的使用
开发语言·redis·python
雨辰AI10 小时前
生产级实测:SpringBoot3 + 达梦数据库接口从 200ms 优化至 20ms 完整调优指南
java·数据库·spring boot·后端·政务
轻刀快马11 小时前
跨越软硬件的共鸣(二):从 Cache 写策略看 Redis 与 DB 的一致性博弈
java·开发语言·redis·计算机组成原理
砍材农夫12 小时前
物联网实战|Spring Boot + Netty 搭建 MQTT 消息路由与流转层
java·spring boot·后端·物联网·spring
lazy H13 小时前
Spring Boot 项目如何连接 Redis?新手入门配置和常见错误总结
ide·spring boot·redis·后端·学习·intellij-idea
SXJR13 小时前
spring boot + langchain4j +milvus实现向量存储
java·spring boot·后端·大模型·milvus·rag·langchain4j
王木风13 小时前
Spring Boot + LLM 工程化:把短视频流水线拆成 16 个独立角色的踩坑记录
人工智能·spring boot·后端·开源·新媒体运营·音视频·agent