首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 程式設計入門

雙 Token 機制實現 Token 超時續簽策略(Java 實現)

     編輯:Java 程式設計入門

業務痛點

單 Token 面臨「短過期不安全、長過期體驗差」兩難。雙 Token 方案:Access Token(短效,如 1h)+ Refresh Token(長效,如 30 天),Access 過期時用 Refresh 換新 Access,無需用戶重新登錄。

核心設計

  • Access Token:攜帶用戶標識 + 過期時間戳(精確到小時),MD5(密碼 + 私鑰 + 時間戳)
  • Refresh Token:同算法但時間窗口更長,或存入 Redis 帶 TTL
  • 驗證邏輯:重新計算當前小時的 Access Token 與客戶端攜帶的比對

完整工具類代碼

import com.google.common.hash.Hashing;
import com.google.common.base.Charsets;
import org.apache.commons.lang.time.FastDateFormat;
import java.util.Date;

public class TokenUtils {
    private static final String PRIVATE_KEY = "fdas34ljfr好sja@#8$%dfkl;js&4*daklfjsdl;akfjsa342";

    // 生成 Access Token(精確到小時)
    public static String getToken(String password) {
        return Hashing.md5().newHasher()
            .putString(password, Charsets.UTF_8)
            .putString(PRIVATE_KEY, Charsets.UTF_8)
            .putString(getDate(), Charsets.UTF_8)
            .hash().toString();
    }

    // 驗證 Access Token
    public static boolean validToken(String token, String password) {
        return getToken(password).equals(token);
    }

    // 獲取「當前小時」字符串 yyyyMMddHH
    public static String getDate() {
        return FastDateFormat.getInstance("yyyyMMddHH").format(new Date());
    }

    // 獲取「下一小時」字符串(用於預簽發/平滑過渡)
    public static String getNextHour(Date now) {
        return FastDateFormat.getInstance("yyyyMMddHH")
            .format(new Date(now.getTime() + 3600_000));
    }
}

雙 Token 流程圖解

登錄成功 → 返回 {access_token, refresh_token, expires_in: 3600}
    ↓
業務請求攜帶 Access Token
    ↓
服務端 validToken() 校驗
    ├─ 通過 → 正常響應
    └─ 失效 → 客戶端攜帶 Refresh Token 請求 /refresh
              ↓
          校驗 Refresh Token(查 Redis/DB、核對簽名)
              ├─ 通過 → 簽發新 Access Token + 新 Refresh Token(可選輪換)
              └─ 失效 → 返回 401,引導重新登錄

安全加固建議

  • 改用 HMAC-SHA256 替代 MD5,防碰撞
  • Refresh Token 存 Redis,支持撤銷、單點登錄
  • Access Token 加入 jti (JWT ID) 防重放
  • HTTPS 傳輸,HttpOnly Cookie 存儲 Refresh Token

總結

本文提供基於「密碼+私鑰+時間窗」的無狀態 Access Token 算法,結合雙 Token 思想,可快速構建「體驗好、安全性可控」的鑒權體系。生產環境建議遷移至 JWT + Redis 方案以支持更豐富的聲明與撤銷策略。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved