成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

接口不掉線,用戶不登出!SpringBoot 無感刷新 Token 全解析

開發 前端
實現無感刷新 Token,是用戶體驗與安全性協同優化的重要實踐。通過后端智能判斷與前端攔截配合,結合雙 Token 模式或動態續簽機制。

在現代 Web 系統中,用戶體驗與安全性的平衡是后端開發的核心命題。本文將基于實際業務場景,全面剖析如何借助 Spring Boot 實現“用戶在線不中斷,身份自動續簽”的無感刷新 Token 機制,并結合前后端聯動,構建完整的 Token 生命周期管理方案。

背景問題:為什么需要無感刷新?

想象這樣一個場景:

“我正在后臺管理系統中錄入數據,頁面突然跳轉回登錄界面,之前填寫的內容全沒了!”

這是典型的 Token 到期導致會話失效 的問題,尤其在使用 Redis 等緩存中間件存儲 Token 時尤為常見。

問題根源

后端通常通過 JWT 來實現無狀態身份驗證,但 JWT 的缺陷也很明顯:過期即失效,無法修改或撤銷。如果不設計 Token 刷新機制,用戶體驗將大打折扣。

核心策略:Token 無感續簽方案概述

方案一:后端自動續期(推薦)

在每次用戶請求時,后端檢查當前 Token 的有效時間:

  • 若臨近過期(如小于5分鐘),則動態生成一個新 Token,加入響應頭中返回;
  • 前端攔截響應頭,若發現新的 Token,與本地不一致則自動更新本地 Token。

方案二:前端主動續簽(補充方案)

  • 前端維護一對 Token:access_token(短期)+ refresh_token(長期);
  • 每隔一段時間,前端使用 refresh_token 去調用刷新接口,獲取新的 access_token

后端實現細節

依賴配置(pom.xml)

<dependencies>
    <dependency>
        <groupId>cn.hutool</groupId>
        <artifactId>hutool-all</artifactId>
        <version>5.5.1</version>
    </dependency>
    <dependency>
        <groupId>com.alibaba</groupId>
        <artifactId>fastjson</artifactId>
        <version>1.2.33</version>
    </dependency>
    <dependency>
        <groupId>io.jsonwebtoken</groupId>
        <artifactId>jjwt</artifactId>
        <version>0.9.1</version>
    </dependency>
</dependencies>

JWT 工具類 JwtUtil.java

 代碼路徑:/src/main/java/com/icoderoad/auth/utils/JwtUtil.java

package com.icoderoad.auth.utils;


import io.jsonwebtoken.*;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
import java.util.*;


public class JwtUtil {
    public static final long JWT_TTL = 1000L * 60 * 60 * 24; // 24小時
    public static final String JWT_KEY = "qx";


    public static String createJWT(String subject) {
        return getJwtBuilder(subject, null, UUID.randomUUID().toString().replace("-", "")).compact();
    }


    public static String createJWT(String subject, Long ttlMillis) {
        return getJwtBuilder(subject, ttlMillis, UUID.randomUUID().toString()).compact();
    }


    private static JwtBuilder getJwtBuilder(String subject, Long ttlMillis, String uuid) {
        long nowMillis = System.currentTimeMillis();
        long expMillis = (ttlMillis != null ? nowMillis + ttlMillis : nowMillis + JWT_TTL);
        SecretKey secretKey = generalKey();
        return Jwts.builder()
                .setId(uuid)
                .setSubject(subject)
                .setIssuer("icoderoad")
                .setIssuedAt(new Date(nowMillis))
                .setExpiration(new Date(expMillis))
                .signWith(SignatureAlgorithm.HS256, secretKey);
    }


    public static Claims parseJWT(String jwt) throws Exception {
        return Jwts.parser()
                .setSigningKey(generalKey())
                .parseClaimsJws(jwt)
                .getBody();
    }


    public static SecretKey generalKey() {
        byte[] key = Base64.getDecoder().decode(JWT_KEY);
        return new SecretKeySpec(key, 0, key.length, "AES");
    }


    public static Date getExpiration(String jwt) {
        try {
            return parseJWT(jwt).getExpiration();
        } catch (Exception e) {
            throw new RuntimeException("Token 解析失敗", e);
        }
    }
}

Token 攔截與續簽邏輯

 攔截器路徑:/src/main/java/com/icoderoad/auth/interceptor/AuthInterceptor.java

public class AuthInterceptor implements HandlerInterceptor {


    private static final long REFRESH_THRESHOLD = 1000L * 60 * 5; // 剩余5分鐘內刷新


    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {


        String token = request.getHeader("Authorization");
        if (StringUtils.isEmpty(token)) {
            throw new RuntimeException("未登錄");
        }


        Claims claims = JwtUtil.parseJWT(token);
        long now = System.currentTimeMillis();
        long exp = claims.getExpiration().getTime();


        if (exp - now < REFRESH_THRESHOLD) {
            String newToken = JwtUtil.createJWT(claims.getSubject());
            response.setHeader("X-Token-Refresh", newToken);
        }


        return true;
    }
}

前端處理邏輯(以 Vue + Axios 為例)

前端攔截代碼:

axios.interceptors.response.use(response => {
    const newToken = response.headers['x-token-refresh'];
    if (newToken && newToken !== localStorage.getItem('access_token')) {
        localStorage.setItem('access_token', newToken);
    }
    return response;
}, error => {
    // 處理401
    if (error.response.status === 401) {
        // 可以保存草稿后跳轉登錄
    }
    return Promise.reject(error);
});

關于 AccessToken 和 RefreshToken 的機制說明

類型

用途

特點

AccessToken

攜帶用戶身份,頻繁使用

安全風險高,需短時過期

RefreshToken

用于續簽 AccessToken

不暴露給前端,一般保存在 Cookie 或 HttpOnly

標準雙 Token 模式提升了安全性和用戶體驗,避免因 AccessToken 頻繁刷新帶來的資源浪費。

特別討論:表單靜默超時的處理策略

場景問題:

用戶長時間填寫表單,沒有發出任何請求,點擊提交時發現 token 已失效,被重定向到登錄頁,數據全丟。

推薦方案:

  • 提交失敗后前端本地緩存表單數據;
  • 登錄成功后回顯草稿,確保用戶體驗不受損;
  • 或者在用戶輸入行為時定期心跳請求,觸發后端續簽。

總結

實現無感刷新 Token,是用戶體驗與安全性協同優化的重要實踐。通過后端智能判斷與前端攔截配合,結合雙 Token 模式或動態續簽機制,我們可以實現:

用戶操作不中斷 身份憑證自動續期 安全控制粒度更靈活

責任編輯:武曉燕 來源: 路條編程
相關推薦

2022-09-28 12:39:46

axios攔截器

2024-07-11 10:38:02

2009-03-06 10:01:00

802.11nWLAN

2009-12-24 13:15:03

2012-05-02 14:41:04

jQuery

2025-01-15 09:21:01

2011-09-07 13:37:40

撥號掉線

2025-04-25 08:30:00

前端后端用戶登錄

2019-10-25 20:00:06

華為

2010-10-08 12:06:40

聯動菜單JavaScript

2012-12-17 11:32:53

無線路由器WLAN

2025-02-10 09:20:00

LinuxScreen終端

2024-04-17 12:59:18

前端Token開發

2025-05-30 02:00:00

Spring接口限流

2018-01-17 09:44:37

LinuxUnix用戶訪問

2011-04-26 13:47:28

墨盒噴墨打印

2022-01-13 17:24:04

SpringBootYml監聽器

2022-01-14 14:50:14

SpringBootymlJava

2025-02-10 14:13:54

SQL語句query

2011-12-26 14:59:31

ATMH3C3G
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 欧美日韩成人一区二区 | 国产精品毛片av | 在线观看视频一区二区三区 | 国产精品三级 | 日本一区精品 | 精品国产精品 | 国产一区二区三区久久久久久久久 | 福利视频一区 | 97精品国产97久久久久久免费 | 免费网站在线 | 欧美亚洲视频 | 日韩成人免费视频 | 亚洲国产精品视频一区 | 国产激情精品视频 | 一区二区三区欧美在线 | 欧美日韩高清在线一区 | 日本亚洲欧美 | 国产成人精品999在线观看 | 97综合在线 | 成人免费一区二区 | 一级毛片免费完整视频 | 男人天堂手机在线视频 | 国内精品久久久久久久 | 超碰免费在 | 国产精品亚洲第一区在线暖暖韩国 | 亚洲国产成人精品女人久久久野战 | 日韩在线一区二区三区 | 久久这里只有精品首页 | 精品免费视频一区二区 | 国产日韩久久 | 日韩国产在线观看 | 91网视频| 亚洲三级在线 | 久久久婷婷 | 国产精品日韩欧美 | 福利网站导航 | 亚洲欧美一区二区三区国产精品 | 亚洲 中文 欧美 日韩 在线观看 | 日韩av在线免费 | 国产免费一二三区 | 国产精品美女久久久免费 |