亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

SpringBoot與Redis的令牌主動失效機制實現

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

前言

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

1. 項目結構和依賴配置

首先,我們需要基于Spring Boot搭建一個簡單的Web項目,同時集成Redis作為緩存數據庫,用于存儲和管理用戶令牌的狀態(tài)信息。通過引入Redis,能夠有效控制令牌的失效機制,從而實現對用戶認證的動態(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實例,并定義了連接池的基本參數。具體參數根據項目需求可以進一步調整。

2. 令牌主動失效機制的實現流程

在這里插入圖片描述

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

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

下面將逐步實現上述功能。

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緩存會定時清除過期數據,因此可以避免手動管理令牌的過期處理。

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); // 從上下文或數據庫中獲取當前用戶的Token
    ValueOperations<String, String> operations = stringRedisTemplate.opsForValue();
    operations.getOperations().delete(token);
}

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

3. Redis的配置與測試

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

@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有效期:可以根據用戶的活躍度或敏感操作動態(tài)調整Token的過期時間,進一步提高系統(tǒng)的靈活性。

結語

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

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

相關文章

  • Spring?Data?JPA查詢方式及方法名查詢規(guī)則介紹

    Spring?Data?JPA查詢方式及方法名查詢規(guī)則介紹

    這篇文章主要介紹了Spring?Data?JPA查詢方式及方法名查詢規(guī)則,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-11-11
  • SpringBoot結合mybatis-plus實現分頁的項目實踐

    SpringBoot結合mybatis-plus實現分頁的項目實踐

    本文主要介紹了SpringBoot結合mybatis-plus實現分頁的項目實踐,主要基于MyBatis-Plus 自帶的分頁插件 PaginationInterceptor,文中通過示例代碼介紹的非常詳細,需要的朋友們下面隨著小編來一起學習學習吧
    2023-06-06
  • Java8中StringJoiner類的使用詳解

    Java8中StringJoiner類的使用詳解

    Java在java.util包中添加了一個新的最終類StringJoiner。可以用于構造由定界符分隔的字符序列。本文將通過示例和大家分享一下StringJoiner類的使用,需要的可以參考一下
    2022-10-10
  • Java加載ICC文件的方法和示例代碼

    Java加載ICC文件的方法和示例代碼

    ICC文件,通常用于顏色管理,定義了如何將一個顏色空間轉換為另一個顏色空間,在Java中,我們可能需要加載這些文件來進行顏色轉換或管理,本文將為您提供加載ICC文件的方法和示例代碼,需要的朋友參考下吧
    2023-08-08
  • java:抽象類與模板方法模式詳解

    java:抽象類與模板方法模式詳解

    這篇文章主要介紹了Java抽象類的構造模板模式用法,結合實例形式分析了java使用抽象類構造模板模式相關操作技巧,需要的朋友可以參考下
    2021-09-09
  • Java中classpath的基本概念和配置方法詳析

    Java中classpath的基本概念和配置方法詳析

    這篇文章主要介紹了Java中的classpath概念,包括其基本概念、設置方法以及在Java應用中的作用,在IDE中的配置也進行了詳細說明,并提到了一些通用注意事項,需要的朋友可以參考下
    2025-02-02
  • IDEA 錯誤之找不到或無法加載主類的問題

    IDEA 錯誤之找不到或無法加載主類的問題

    這篇文章主要介紹了IDEA 錯誤之找不到或無法加載主類,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-08-08
  • 使用springboot配置和占位符獲取配置文件中的值

    使用springboot配置和占位符獲取配置文件中的值

    這篇文章主要介紹了使用springboot配置和占位符獲取配置文件中的值,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-02-02
  • Java字符串技巧之刪除標點或最后字符的方法

    Java字符串技巧之刪除標點或最后字符的方法

    這篇文章主要介紹了Java字符串技巧之刪除標點或最后字符的方法,是Java入門學習中的基礎知識,需要的朋友可以參考下
    2015-11-11
  • Java圖形化編程之JFrame疫苗接種系統(tǒng)詳解

    Java圖形化編程之JFrame疫苗接種系統(tǒng)詳解

    GUI圖形界面設計是用戶和程序交互的工具,用戶通過圖形界面控制程序事件的發(fā)生。首先介紹Swing的基本體系結構,這是底層
    2021-09-09

最新評論