java中實(shí)現(xiàn)token過期失效超時(shí)
在Java應(yīng)用程序中,為了確保安全性和保護(hù)用戶數(shù)據(jù),一種常見的做法是使用Token進(jìn)行身份驗(yàn)證和授權(quán)。Token是由服務(wù)器生成的具有一定時(shí)效的令牌,用于識(shí)別和驗(yàn)證用戶身份。Token失效是一種常見的安全手段,用于保護(hù)用戶的身份和數(shù)據(jù)安全。當(dāng)Token失效后,用戶將無法再進(jìn)行相關(guān)操作,從而提高系統(tǒng)的安全性。
技術(shù)選型
本項(xiàng)目方案將使用以下技術(shù)來實(shí)現(xiàn)Token的失效功能:
Spring Boot:用于構(gòu)建Java Web應(yīng)用程序。
JWT(JSON Web Token):用于生成和驗(yàn)證Token。
Redis:用于存儲(chǔ)Token和相關(guān)信息。
Spring AOP(面向切面編程):用于實(shí)現(xiàn)Token失效的切面邏輯。
實(shí)現(xiàn)步驟
步驟1:生成Token
首先,我們需要生成一個(gè)Token,用于標(biāo)識(shí)用戶的身份信息??梢允褂肑ava的JWT庫(kù)來生成Token,以下是示例代碼:
import io.jsonwebtoken.Jwts; import io.jsonwebtoken.SignatureAlgorithm; public class TokenUtil { private static final String SECRET_KEY = "your_secret_key"; public static String generateToken(String userId) { return Jwts.builder() .setSubject(userId) .signWith(SignatureAlgorithm.HS512, SECRET_KEY) .compact(); } } -----------------------------------
在上面的代碼中,generateToken方法接收一個(gè)userId參數(shù),并使用JWT庫(kù)生成一個(gè)Token,然后返回給調(diào)用方。請(qǐng)注意,SECRET_KEY是用于對(duì)Token進(jìn)行簽名的密鑰,需要保密。
步驟2:驗(yàn)證Token有效性
為了在用戶請(qǐng)求到達(dá)時(shí)快速驗(yàn)證Token的有效性,可以使用Redis存儲(chǔ)Token和相關(guān)信息。在Spring Boot應(yīng)用程序中,可以使用以下代碼將Token存儲(chǔ)到Redis中:
import io.jsonwebtoken.Claims; import io.jsonwebtoken.Jwts; public class TokenUtil { // ... public static boolean validateToken(String token) { try { Jwts.parser().setSigningKey(SECRET_KEY).parseClaimsJws(token); return true; } catch (Exception e) { return false; } } } -----------------------------------
在上面的代碼中,validateToken方法接收一個(gè)Token參數(shù),使用JWT庫(kù)對(duì)Token進(jìn)行解析和驗(yàn)證。如果解析和驗(yàn)證成功,說明Token有效,返回true;否則,返回false。
步驟3:失效Token
當(dāng)用戶需要退出登錄或者一段時(shí)間內(nèi)沒有進(jìn)行任何操作時(shí),我們需要將Token失效,從而保證用戶的安全。以下是示例代碼:
使用Spring AOP可以實(shí)現(xiàn)在每個(gè)請(qǐng)求中驗(yàn)證Token的有效性,并在Token失效時(shí)進(jìn)行相應(yīng)的處理。在Spring Boot應(yīng)用程序中,可以使用以下代碼實(shí)現(xiàn)Token失效切面:
import java.util.Map; import java.util.concurrent.ConcurrentHashMap; public class TokenUtil { // ... private static Map<String, String> invalidatedTokens = new ConcurrentHashMap<>(); public static void invalidateToken(String token) { invalidatedTokens.put(token, token); } public static boolean isTokenInvalidated(String token) { return invalidatedTokens.containsKey(token); } } -----------------------------------
步驟4:處理失效邏輯
最后,我們需要在系統(tǒng)的某個(gè)位置,例如在每個(gè)請(qǐng)求的攔截器中,判斷Token是否失效,并進(jìn)行相應(yīng)的處理邏輯。以下是示例代碼:
在需要使用Token的接口上,可以使用自定義注解@TokenRequired來標(biāo)識(shí)該接口需要進(jìn)行Token驗(yàn)證。例如:
import javax.servlet.http.HttpServletRequest; public class TokenInterceptor { // ... public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { String token = request.getHeader("Authorization"); if (token != null && !TokenUtil.isTokenInvalidated(token)) { // Token有效,繼續(xù)處理業(yè)務(wù)邏輯 return true; } else { // Token無效,返回錯(cuò)誤信息 response.setStatus(HttpServletResponse.SC_UNAUTHORIZED); return false; } } } -----------------------------------
在上面的代碼中,我們從請(qǐng)求頭中獲取Token,并使用TokenUtil.isTokenInvalidated方法判斷Token是否失效。如果Token有效,我們繼續(xù)處理業(yè)務(wù)邏輯,如果Token無效,我們返回未授權(quán)的錯(cuò)誤信息。
總結(jié)
本文介紹了如何使用Java實(shí)現(xiàn)Token失效的功能。通過生成Token、驗(yàn)證Token有效性、失效Token和處理失效邏輯等步驟,我們可以保證用戶用戶的身份和數(shù)據(jù)安全。
到此這篇關(guān)于java中實(shí)現(xiàn)token過期失效超時(shí)的文章就介紹到這了,更多相關(guān)java中token過期內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
詳解關(guān)于eclipse中使用jdk15對(duì)應(yīng)javafx15的配置問題總結(jié)
這篇文章主要介紹了詳解關(guān)于eclipse中使用jdk15對(duì)應(yīng)javafx15的配置問題總結(jié),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-11-11SpringCloud中Zuul網(wǎng)關(guān)原理及其配置
Spring?Cloud是一個(gè)基于Spring?Boot實(shí)現(xiàn)的微服務(wù)應(yīng)用開發(fā)工具,其中的Zuul網(wǎng)關(guān)可以實(shí)現(xiàn)負(fù)載均衡、路由轉(zhuǎn)發(fā)、鑒權(quán)、限流等功能,本文將從Spring?Cloud中Zuul網(wǎng)關(guān)的原理、使用場(chǎng)景和配置過程詳細(xì)介紹,幫助大家更好地了解和應(yīng)用Zuul網(wǎng)關(guān),需要的朋友可以參考下2023-06-06淺談Java中BIO、NIO和AIO的區(qū)別和應(yīng)用場(chǎng)景
這篇文章主要介紹了Java中BIO、NIO和AIO的區(qū)別,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-04-04springmvc+mybatis 做分頁(yè)sql 語(yǔ)句實(shí)例代碼
本文通過一段實(shí)例代碼給大家介紹了springmvc+mybatis 做分頁(yè)sql 語(yǔ)句的方法,代碼簡(jiǎn)單易懂,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友參考下吧2017-07-07關(guān)于Selenium的UI自動(dòng)化測(cè)試屏幕截圖功能實(shí)例代碼
今天小編就為大家分享一篇關(guān)于Selenium的UI自動(dòng)化測(cè)試屏幕截圖功能實(shí)例代碼,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2018-05-05Spring事務(wù)失效場(chǎng)景原理及解決方案
這篇文章主要介紹了Spring事務(wù)失效場(chǎng)景原理及解決方案,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-09-09Java中的Map接口實(shí)現(xiàn)類HashMap和LinkedHashMap詳解
這篇文章主要介紹了Java中的Map接口實(shí)現(xiàn)類HashMap和LinkedHashMap詳解,我們常會(huì)看到這樣的一種集合,IP地址與主機(jī)名,等,這種一一對(duì)應(yīng)的關(guān)系,就叫做映射,Java提供了專門的集合類用來存放這種對(duì)象關(guān)系的對(duì)象,需要的朋友可以參考下2024-01-01