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

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

開發(fā) 前端
實現(xiàn)無感刷新 Token,是用戶體驗與安全性協(xié)同優(yōu)化的重要實踐。通過后端智能判斷與前端攔截配合,結(jié)合雙 Token 模式或動態(tài)續(xù)簽機制。

在現(xiàn)代 Web 系統(tǒng)中,用戶體驗與安全性的平衡是后端開發(fā)的核心命題。本文將基于實際業(yè)務(wù)場景,全面剖析如何借助 Spring Boot 實現(xiàn)“用戶在線不中斷,身份自動續(xù)簽”的無感刷新 Token 機制,并結(jié)合前后端聯(lián)動,構(gòu)建完整的 Token 生命周期管理方案。

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

想象這樣一個場景:

“我正在后臺管理系統(tǒng)中錄入數(shù)據(jù),頁面突然跳轉(zhuǎn)回登錄界面,之前填寫的內(nèi)容全沒了!”

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

問題根源

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

核心策略:Token 無感續(xù)簽方案概述

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

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

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

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

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

后端實現(xiàn)細節(jié)

依賴配置(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 攔截與續(xù)簽邏輯

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

public class AuthInterceptor implements HandlerInterceptor {


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


    @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) {
        // 可以保存草稿后跳轉(zhuǎn)登錄
    }
    return Promise.reject(error);
});

關(guān)于 AccessToken 和 RefreshToken 的機制說明

類型

用途

特點

AccessToken

攜帶用戶身份,頻繁使用

安全風險高,需短時過期

RefreshToken

用于續(xù)簽 AccessToken

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

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

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

場景問題:

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

推薦方案:

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

總結(jié)

實現(xiàn)無感刷新 Token,是用戶體驗與安全性協(xié)同優(yōu)化的重要實踐。通過后端智能判斷與前端攔截配合,結(jié)合雙 Token 模式或動態(tài)續(xù)簽機制,我們可以實現(xiàn):

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

責任編輯:武曉燕 來源: 路條編程
相關(guān)推薦

2022-09-28 12:39:46

axios攔截器

2024-07-11 10:38:02

2009-03-06 10:01:00

802.11nWLAN

2025-01-15 09:21:01

2009-12-24 13:15:03

2012-05-02 14:41:04

jQuery

2011-09-07 13:37:40

撥號掉線

2010-10-08 12:06:40

聯(lián)動菜單JavaScript

2025-04-25 08:30:00

前端后端用戶登錄

2019-10-25 20:00:06

華為

2025-07-02 08:10:01

StarRocks物化視圖MV

2012-12-17 11:32:53

無線路由器WLAN

2025-02-10 09:20:00

LinuxScreen終端

2024-04-17 12:59:18

前端Token開發(fā)

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監(jiān)聽器

2022-01-14 14:50:14

SpringBootymlJava

2025-02-10 14:13:54

SQL語句query
點贊
收藏

51CTO技術(shù)棧公眾號

主站蜘蛛池模板: 祝你幸福电影在线观看 | h视频免费在线观看 | 在线日韩精品视频 | 性一爱一乱一交一视频 | 国产伦精品一区二区三区精品视频 | 视频一区在线观看 | 九九亚洲| 久久国产区 | 美女久久久久久久久 | 国产精品一区在线观看 | 亚洲国产精品一区二区三区 | 夜夜av| 久久中文字幕电影 | av日日操| 99久久婷婷国产综合精品首页 | 天堂成人国产精品一区 | 超碰欧美| 一级免费黄色 | 国产毛片视频 | 欧美国产激情 | 99精品视频一区二区三区 | 2一3sex性hd | 日本久草| 91精品国产一区二区三区蜜臀 | 国产精品久久九九 | 国产美女精品 | 成人免费视频观看 | 欧美亚洲视频在线观看 | 91视频官网 | 日韩电影免费在线观看中文字幕 | 在线观看国产视频 | 福利视频网站 | 成人精品一区二区三区四区 | 久久精品日产第一区二区三区 | 欧美老少妇一级特黄一片 | 亚洲精品在线看 | 日韩黄a | 精品日韩| 精品视频一区二区 | 看片网站在线 | 久久久久网站 |