最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

SpringBoot與Redis的令牌主動失效機制實現(xiàn)

 更新時間:2024年12月10日 10:49:40   作者:cooldream2009  
本文詳細介紹了基于SpringBoot和Redis實現(xiàn)令牌主動失效機制,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧

前言

在現(xiàn)代Web系統(tǒng)中,用戶認證是一個核心問題,尤其是在分布式系統(tǒng)和微服務架構中,如何高效、安全地管理用戶登錄狀態(tài)顯得尤為重要。通常,系統(tǒng)通過令牌(Token)來進行身份驗證,令牌的生命周期控制對于安全性非常關鍵。當用戶修改密碼等敏感操作后,確保其之前的令牌失效,是一種常用的安全策略,可以有效防止憑證被盜后惡意訪問的風險。本文將詳細介紹基于Spring Boot和Redis實現(xiàn)令牌主動失效機制的設計與實現(xiàn)思路,幫助讀者理解和應用該方案來提高系統(tǒng)的安全性和穩(wěn)定性。

1. 項目結構和依賴配置

首先,我們需要基于Spring Boot搭建一個簡單的Web項目,同時集成Redis作為緩存數(shù)據(jù)庫,用于存儲和管理用戶令牌的狀態(tài)信息。通過引入Redis,能夠有效控制令牌的失效機制,從而實現(xiàn)對用戶認證的動態(tài)管理。

在這里插入圖片描述

1.1 項目依賴配置

在項目的pom.xml中添加如下依賴,用于集成Redis:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>

1.2 Redis連接配置

application.yml中配置Redis的連接信息:

spring:
  redis:
    host: localhost
    port: 6379
    timeout: 6000ms
    lettuce:
      pool:
        max-active: 8
        max-idle: 2
        min-idle: 1
        max-wait: -1ms

該配置將連接本地的Redis實例,并定義了連接池的基本參數(shù)。具體參數(shù)根據(jù)項目需求可以進一步調整。

2. 令牌主動失效機制的實現(xiàn)流程

在這里插入圖片描述

在實現(xiàn)令牌主動失效機制時,我們需要進行三步操作:

  • 用戶登錄成功后,系統(tǒng)會生成一個Token并將其存儲在Redis中。
  • 在后續(xù)的每次請求中,通過攔截器從Redis中驗證令牌的有效性。
  • 當用戶修改密碼等操作成功后,系統(tǒng)主動刪除Redis中的Token,使之前的令牌失效。

下面將逐步實現(xiàn)上述功能。

2.1 登錄成功后將令牌存儲到Redis中

首先,在用戶登錄成功的情況下,系統(tǒng)會生成一個Token。為了方便講解,這里采用一個簡單的UUID作為Token示例。生成的Token不僅返回給前端,也會同步存儲到Redis中,并設置一定的有效時間(如1小時)。

示例代碼如下:

@Autowired
private StringRedisTemplate stringRedisTemplate;

public String login(String username, String password) {
    // 生成Token
    String token = UUID.randomUUID().toString();
    // 將Token存儲到Redis中,有效期1小時
    ValueOperations<String, String> operations = stringRedisTemplate.opsForValue();
    operations.set(token, token, 1, TimeUnit.HOURS);
    // 返回給用戶的響應中包含Token
    return token;
}

上述代碼通過StringRedisTemplateopsForValue方法,將Token以鍵值對的形式存儲到Redis中。Redis緩存會定時清除過期數(shù)據(jù),因此可以避免手動管理令牌的過期處理。

2.2 使用攔截器驗證令牌

每次用戶請求時,我們需要驗證用戶攜帶的Token是否有效。通過Spring的攔截器機制,可以在請求進入控制器之前檢查Redis中的Token,判斷其是否有效。若Token無效或已過期,則拒絕訪問。

攔截器代碼如下:

public class LoginInterceptor implements HandlerInterceptor {

    @Autowired
    private StringRedisTemplate stringRedisTemplate;

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        // 從請求頭中獲取Token
        String token = request.getHeader("Authorization");
        if (token == null || token.isEmpty()) {
            throw new RuntimeException("缺少令牌");
        }

        // 從Redis中查詢Token
        ValueOperations<String, String> operations = stringRedisTemplate.opsForValue();
        String redisToken = operations.get(token);

        if (redisToken == null) {
            // Token不存在或已過期,拋出異常
            throw new RuntimeException("無效的令牌");
        }
        // Token有效,繼續(xù)處理請求
        return true;
    }
}

LoginInterceptor中,我們通過StringRedisTemplateopsForValue方法獲取Redis中的Token并與請求攜帶的Token對比。如果Token不存在,則直接拒絕該請求。若Token存在且有效,繼續(xù)進行請求處理。

2.3 用戶修改密碼后刪除舊令牌

當用戶成功修改密碼時,需要確保之前的Token立即失效。因此,成功修改密碼后,我們需要從Redis中刪除該用戶的Token記錄,防止舊Token被再次使用。

在修改密碼的業(yè)務邏輯中,加入刪除Token的代碼:

public void changePassword(String username, String newPassword) {
    // 假設用戶驗證通過并修改了密碼
    // 刪除Redis中的舊Token
    String token = getCurrentTokenForUser(username); // 從上下文或數(shù)據(jù)庫中獲取當前用戶的Token
    ValueOperations<String, String> operations = stringRedisTemplate.opsForValue();
    operations.getOperations().delete(token);
}

在上述代碼中,通過getOperations().delete()方法刪除Token,使得舊Token立即失效。這樣用戶在修改密碼后需要重新登錄,保證了賬戶的安全性。

3. Redis的配置與測試

為了確保上述邏輯的正確性和Redis的穩(wěn)定性,建議在開發(fā)階段通過單元測試驗證Redis的連接和數(shù)據(jù)操作。

@SpringBootTest
class RedisTest {

    @Autowired
    private StringRedisTemplate stringRedisTemplate;

    @Test
    public void testSet() {
        ValueOperations<String, String> operations = stringRedisTemplate.opsForValue();
        operations.set("username", "zhangsan");
        operations.set("id", "1", 15, TimeUnit.SECONDS);

        // 檢查存儲的值
        String username = operations.get("username");
        System.out.println("用戶名:" + username);
    }
}

以上代碼將usernameid存儲到Redis中,并設置了15秒的有效期。通過單元測試,可以直觀地驗證Redis的寫入和有效期的功能是否正常工作。

4. 可能的擴展與優(yōu)化

在實際應用中,可以進一步對該令牌失效機制進行擴展和優(yōu)化:

  • 基于用戶ID管理Token:可以在Redis中以userId為鍵,存儲用戶當前的Token,這樣方便管理用戶的多個Token(如多設備登錄)。
  • 使用JWT(JSON Web Token):在Token中加入用戶的相關信息(如用戶ID、權限等),以減少對Redis的依賴。不過仍需在修改密碼等場景下失效Token。
  • 動態(tài)調整Token有效期:可以根據(jù)用戶的活躍度或敏感操作動態(tài)調整Token的過期時間,進一步提高系統(tǒng)的靈活性。

結語

本文詳細介紹了基于Spring Boot和Redis實現(xiàn)令牌主動失效機制的完整流程,并提供了關鍵代碼示例。通過將Token存儲在Redis中并在必要時主動刪除,確保了用戶在修改密碼等操作后的Token立即失效,從而有效增強了系統(tǒng)的安全性。這種方案在實際開發(fā)中具有良好的應用價值。通過適當擴展和優(yōu)化,還可以滿足更復雜的業(yè)務需求,為用戶提供更優(yōu)質的服務體驗。

到此這篇關于SpringBoot與Redis的令牌主動失效機制實現(xiàn)的文章就介紹到這了,更多相關SpringBoot Redis令牌主動失效內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • Spring中的@ControllerAdvice和@ExceptionHandler注解處理全局異常

    Spring中的@ControllerAdvice和@ExceptionHandler注解處理全局異常

    這篇文章主要介紹了Spring中的@ControllerAdvice和@ExceptionHandler注解處理全局異常,@ControllerAdvice ,@ControllerAdvice是一個非常有用的注解,顧名思義,這是一個增強的 Controller,一般配合@ExceptionHandler使用來處理全局異常,需要的朋友可以參考下
    2024-01-01
  • java圖的深度優(yōu)先遍歷實現(xiàn)隨機生成迷宮

    java圖的深度優(yōu)先遍歷實現(xiàn)隨機生成迷宮

    這篇文章主要為大家詳細介紹了java圖的深度優(yōu)先遍歷實現(xiàn)隨機生成迷宮,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-01-01
  • 詳解Java事件編程的使用

    詳解Java事件編程的使用

    Java事件在很多地方都可以使用,合理的使用事件編程,相比常規(guī)邏輯的編程,這可達到主次分明,讓程序吞吐量即處理能力更強,改動更少,下面我們舉一個例子說明如何使用Java使用,需要的朋友可以參考下
    2021-06-06
  • 正確使用Java?CompletableFuture對象的方法

    正確使用Java?CompletableFuture對象的方法

    本文將深入探討Java的CompletableFuture,一種強大的工具,用于簡化異步編程和并發(fā)任務管理,我們將介紹CompletableFuture的基本概念、核心方法以及實際應用場景,感興趣的朋友跟隨小編一起看看吧
    2025-10-10
  • Nacos負載均衡策略總結

    Nacos負載均衡策略總結

    Nacos 作為目前主流的微服務中間件,包含了兩個頂級的微服務功能:配置中心和注冊中心,本文給大家總結了幾種Nacos負載均衡策略,通過圖文結合介紹的非常詳細,需要的朋友可以參考下
    2023-11-11
  • 解決IDEA中同項目引用報紅問題

    解決IDEA中同項目引用報紅問題

    在IDEA中,如果項目引用報紅,可能是因為IDEA的引用緩存問題,可以通過File->Invalidate Caches/Restart清空緩存并重建索引來解決,這個方法可以幫助解決同項目中引用找不到的問題,恢復正常的項目引用,消除報紅
    2024-09-09
  • Java面試題沖刺第二十九天--JVM3

    Java面試題沖刺第二十九天--JVM3

    這篇文章主要為大家分享了最有價值的三道關于JVM的面試題,涵蓋內容全面,包括數(shù)據(jù)結構和算法相關的題目、經典面試編程題等,感興趣的小伙伴們可以參考一下
    2021-09-09
  • 如何使用java修改文件所有者及其權限

    如何使用java修改文件所有者及其權限

    這篇文章主要介紹了如何使用java修改文件所有者及其權限,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2019-12-12
  • Java線程阻塞方法sleep()與wait()的全面講解

    Java線程阻塞方法sleep()與wait()的全面講解

    這篇文章主要介紹了Java線程阻塞方法sleep()與wait()的全面講解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-02-02
  • SpringBoot項目熱部署的實現(xiàn)

    SpringBoot項目熱部署的實現(xiàn)

    SpringBoot項目熱部署是一種讓開發(fā)人員在修改代碼后無需重啟應用即可看到更改效果的技術,通過使用SpringBoot的DevTools等工具,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2024-09-09

最新評論

昆明市| 武邑县| 宝丰县| 太保市| 兴宁市| 苏尼特左旗| 新乡县| 扎鲁特旗| 兴仁县| 金乡县| 手机| 永顺县| 通州区| 湘乡市| 共和县| 时尚| 玉环县| 中牟县| 梓潼县| 磴口县| 同江市| 海城市| 海门市| 桐城市| 西乌珠穆沁旗| 凤城市| 巴彦县| 准格尔旗| 同江市| 任丘市| 屏东市| 曲水县| 南乐县| 葵青区| 东安县| 涿鹿县| 资兴市| 汽车| 中牟县| 若羌县| 顺义区|