锋盈数科-知识库 Logo
首页
软件开发
计算机基础
Hello Halo
新手必读
关于本知识库
登录 →
锋盈数科-知识库 Logo
首页 软件开发 计算机基础 Hello Halo 新手必读 关于本知识库
登录
  1. 首页
  2. 软件开发
  3. JAVA
  4. Java实战:Spring Boot实现无感刷新Token机制

Java实战:Spring Boot实现无感刷新Token机制

0
  • JAVA
  • 发布于 2024-08-13
  • 0 次阅读
黄健
黄健

本文由 简悦 SimpRead 转码, 原文地址 blog.csdn.net

引言

在当前的 Web 应用开发中,JSON Web Tokens(JWT)作为一种轻量级的认证协议,因其无状态、自包含的特性而备受青睐。然而,JWT 默认的有效期有限,如何在不影响用户体验的前提下实现 Token 的自动刷新,即所谓的 “无感刷新 Token”,成为了许多开发者关注的问题。本文将深入探讨如何在 Spring Boot 项目中实现无感刷新 Token 机制,并通过具体的示例代码,逐步引导读者掌握这一核心技术。

一、理解 JWT 与 Token 刷新

  1. JWT 基础
    JSON Web Tokens 由头部(Header)、载荷(Payload)和签名(Signature)三部分组成,其中载荷部分可以携带过期时间(exp)。一旦 Token 过期,用户必须重新登录以获取新的 Token。

  2. Token 刷新
    无感刷新 Token,是指在用户正常操作期间,系统在后台自动刷新 Token 的有效期,避免因 Token 过期而导致用户被迫重新登录。

二、基于 Refresh Token 的双 Token 机制

  1. Refresh Token
    一种常见的无感刷新 Token 策略是采用双 Token 机制,即同时发放 Access Token 和 Refresh Token。Access Token 用于身份验证,有效期较短;Refresh Token 用于获取新的 Access Token,有效期较长。

  2. 刷新流程
    当 Access Token 即将过期时,客户端携带 Refresh Token 向服务器请求新的 Access Token,服务器验证 Refresh Token 有效后,颁发新的 Access Token,并可以选择性地更新 Refresh Token。

三、Spring Boot 实现无感刷新 Token 实战

  1. 生成与解析 JWT
    首先,我们需要引入 JWT 相关的依赖,如jjwt,并实现 JWT 的生成与解析。
// JWT工具类
@Component
public class JwtUtil {
    
    private String secret = "your-secret-key"; // 密钥
    
    public String generateToken(UserDetails userDetails) {
        // 创建JWT并设置过期时间、载荷信息
        // ...
        return Jwts.builder()
            .setSubject(userDetails.getUsername())
            .setExpiration(new Date(System.currentTimeMillis() + expirationTime))
            .signWith(SignatureAlgorithm.HS512, secret)
            .compact();
    }

    public Boolean validateToken(String token, UserDetails userDetails) {
        // 验证JWT有效性
        // ...
    }

    public String refreshToken(String token) {
        // 从token中提取subject(用户名)
        // 检查Refresh Token有效性
        // 生成新的Access Token
        // ...
    }
}
  1. 拦截器实现 Token 刷新
    创建一个 Spring Security 拦截器,用于处理带有 JWT 的 HTTP 请求,并在必要时自动刷新 Token。
@Component
public class JwtRequestFilter extends OncePerRequestFilter {

    @Autowired
    private JwtUtil jwtUtil;

    @Override
    protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain chain)
            throws ServletException, IOException {
        
        String authorizationHeader = request.getHeader("Authorization");
        if (authorizationHeader != null && authorizationHeader.startsWith("Bearer ")) {
            String token = authorizationHeader.substring(7); // 获取Token
            String username = jwtUtil.extractUsername(token); // 提取用户名

            // 检查Token是否过期,如果即将过期,则尝试刷新Token
            if (jwtUtil.isTokenAboutToExpire(token)) {
                String refreshedToken = jwtUtil.refreshToken(token);
                // 更新响应头中的Token信息
                // ...
            }
        }

        chain.doFilter(request, response);
    }
}
  1. 客户端处理 Token 刷新
    在前端或移动端,通过监听 HTTP 请求的响应头,获取新的 Access Token,并更新本地存储。

四、进一步优化与注意事项

  1. Refresh Token 安全性
    为保证系统安全,Refresh Token 应具备足够的保护措施,如限制其生命周期、禁止跨域使用、考虑绑定设备等。

  2. 离线刷新
    对于某些场景,可以考虑实现离线刷新 Token,即在客户端检测到 Token 即将过期时,即使用户尚未发起新的 HTTP 请求,也主动向服务器请求新的 Token。

  3. API Gateway 集成
    在微服务架构中,可以利用 API Gateway 处理 Token 刷新,减轻服务端的压力,同时实现更灵活的刷新策略。

五、结论

通过本文的阐述与示例,我们了解到如何在 Spring Boot 中实现基于 JWT 的无感刷新 Token 机制。实际应用中,应根据项目需求,结合最佳实践,对 Token 刷新策略进行合理设计与优化,以实现既保证系统安全性,又能提供良好用户体验的目标。

标签: #JAVA 991
相关文章

Spring 实现 3 种异步接口 2024-10-18 09:07

大家好,我是苏三~ 如何处理比较耗时的接口? 这题我熟,直接上异步接口,使用 Callable、WebAsyncTask 和 DeferredResult、CompletableFuture等均可实现。 但这些方法有局限性,处理结果仅返回单个值。在某些场景下,如果需要接口异步处理的同时,还持续不断地

重学SpringBoot3-集成Redis(五)之布隆过滤器 2024-10-08 11:24

更多SpringBoot3内容请关注我的专栏:《SpringBoot3》 期待您的点赞👍收藏⭐评论✍ 重学SpringBoot3-集成Redis(五)之布隆过滤器 1. 什么是布隆过滤器? * 基本概念 适用场景 2. 使用 Redis 实现布隆过滤器 * 项目依赖 Redis 配置

SpringBoot整合异步任务执行 2024-10-08 11:24

同步任务: 同步任务是在单线程中按顺序执行,每次只有一个任务在执行,不会引发线程安全和数据一致性等 并发问题 同步任务需要等待任务执行完成后才能执行下一个任务,无法同时处理多个任务,响应慢,影响用 户体验 异步任务: 异步任务是在多线程中同时执行,多个任务可以并发执行,同时处理多个请求,响应快,资源

springboot kafka多数据源,通过配置动态加载发送者和消费者 2024-10-08 11:24

前言 最近做项目,需要支持kafka多数据源,实际上我们也可以通过代码固定写死多套kafka集群逻辑,但是如果需要不修改代码扩展呢,因为kafka本身不处理额外逻辑,只是起到削峰,和数据的传递,那么就需要对架构做一定的设计了。 准备test kafka本身非常容易上手,如果我们需要单元测试,引入ja

SpringBoot 集成 Redis 2024-10-08 11:24

一:SpringBoot 集成 Redis ①Redis是一个 NoSQL(not only)数据库, 常作用缓存 Cache 使用。 ②Redis是一个中间件、是一个独立的服务器;常用的数据类型: string , hash ,set ,zset , list ③通过Redis客户端可以使用多种语

SpringBoot整合QQ邮箱 2024-10-08 11:24

SpringBoot可以通过导入依赖的方式集成多种技术,这当然少不了我们常用的邮箱,现在本章演示SpringBoot整合QQ邮箱发送邮件…. 下面按步骤进行: 1.获取QQ邮箱授权码 1.1 登录QQ邮箱 1.2 开启SMTP服务 找到下图中的SMTP服务区域,如果当前账号未开启的话自己手动开启。

目录

IT 外包服务商

  • 意见投递
  • zyf6619

软件开发应用

主菜单

  • 首页
  • 软件开发
  • 计算机基础
  • Hello Halo
  • 新手必读
  • 关于本知识库
Copyright © 2024 your company All Rights Reserved. Powered by Halo.