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

SpringBoot整合Redis實(shí)現(xiàn)登錄失敗鎖定功能(實(shí)例詳解)

 更新時(shí)間:2024年02月26日 11:03:07   作者:啄sir.  
本文我們已經(jīng)探討如何利用Redis來(lái)實(shí)現(xiàn)鎖定賬戶(hù)的安全措施,以及通過(guò)SpringBoot整合Redis實(shí)現(xiàn)了這一功能,感興趣的朋友跟隨小編一起學(xué)習(xí)下吧

前言

在現(xiàn)代的軟件開(kāi)發(fā)中,安全性和用戶(hù)體驗(yàn)是至關(guān)重要的方面。特別是在身份驗(yàn)證和授權(quán)方面,保護(hù)用戶(hù)賬戶(hù)免受惡意訪(fǎng)問(wèn)是至關(guān)重要的。一種常見(jiàn)的安全措施是通過(guò)限制登錄失敗的嘗試次數(shù)來(lái)防止暴力破解攻擊。這意味著如果用戶(hù)連續(xù)多次輸入錯(cuò)誤的憑據(jù),系統(tǒng)將暫時(shí)禁止其登錄,以防止進(jìn)一步的嘗試。

在本博客中,我們將探討如何利用Redis來(lái)實(shí)現(xiàn)這樣的安全措施。具體來(lái)說(shuō),我們將學(xué)習(xí)如何在用戶(hù)連續(xù)多次登錄失敗后,暫時(shí)將其賬戶(hù)鎖定一段時(shí)間(例如一分鐘),以確保系統(tǒng)的安全性和用戶(hù)體驗(yàn)。通過(guò)結(jié)合Spring Boot的便利性和Redis的高效性,我們能夠輕松實(shí)現(xiàn)這一功能,提高系統(tǒng)的安全性,同時(shí)確保用戶(hù)友好的體驗(yàn)。讓我們深入探討這個(gè)案例,并了解如何在Spring Boot應(yīng)用中實(shí)現(xiàn)這一重要功能。

一、為何選擇Redis作為賬戶(hù)鎖定的存儲(chǔ)解決方案?

在實(shí)現(xiàn)登錄失敗次數(shù)過(guò)多時(shí)的賬戶(hù)鎖定功能時(shí),選擇適當(dāng)?shù)臄?shù)據(jù)存儲(chǔ)解決方案至關(guān)重要。Redis作為一個(gè)高性能的內(nèi)存數(shù)據(jù)庫(kù),提供了一系列特性,使其成為這一場(chǎng)景的理想選擇。

  • 快速的讀寫(xiě)操作:Redis以?xún)?nèi)存為基礎(chǔ),能夠快速執(zhí)行讀寫(xiě)操作,特別適用于需要頻繁更新的計(jì)數(shù)場(chǎng)景。這意味著我們能夠迅速地記錄用戶(hù)的登錄失敗次數(shù),并實(shí)時(shí)更新賬戶(hù)的鎖定狀態(tài)。
  • 原子性操作: Redis支持原子性操作,能夠確保在多線(xiàn)程或多進(jìn)程環(huán)境下,對(duì)數(shù)據(jù)的讀寫(xiě)操作是線(xiàn)程安全的。這對(duì)于確保登錄失敗次數(shù)的準(zhǔn)確性和賬戶(hù)鎖定的可靠性至關(guān)重要。
  • 過(guò)期時(shí)間設(shè)置: Redis允許我們?yōu)榇鎯?chǔ)的數(shù)據(jù)設(shè)置過(guò)期時(shí)間,這非常有利于實(shí)現(xiàn)一定時(shí)間內(nèi)的賬戶(hù)鎖定。例如,我們可以設(shè)置一個(gè)一分鐘的過(guò)期時(shí)間,讓用戶(hù)在一定時(shí)間后自動(dòng)解鎖。
  • 靈活的數(shù)據(jù)結(jié)構(gòu): Redis支持多種數(shù)據(jù)結(jié)構(gòu),包括字符串、哈希、列表等,這使得我們能夠更靈活地存儲(chǔ)和管理與賬戶(hù)鎖定相關(guān)的信息,而不僅僅局限于簡(jiǎn)單的計(jì)數(shù)。
  • 持久性選項(xiàng): 雖然Redis以?xún)?nèi)存為主,但它也支持持久性選項(xiàng),可以將數(shù)據(jù)持久化到磁盤(pán),以防止數(shù)據(jù)丟失。這對(duì)于一些安全敏感的場(chǎng)景是一個(gè)備用的選項(xiàng)。

總的來(lái)說(shuō),Redis的快速性能、原子性操作、過(guò)期時(shí)間設(shè)置和靈活的數(shù)據(jù)結(jié)構(gòu)使其成為實(shí)現(xiàn)登錄失敗次數(shù)過(guò)多時(shí)的賬戶(hù)鎖定功能的優(yōu)秀選擇。在結(jié)合Spring Boot的便捷性和Redis的高效性時(shí),我們能夠輕松而可靠地增加系統(tǒng)的安全性

二、代碼案例講解

1.引入依賴(lài)

 <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
<dependency>
            <groupId>com.mysql</groupId>
            <artifactId>mysql-connector-j</artifactId>
            <version>8.0.31</version>
        </dependency>
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.4.3</version>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.24</version>
        </dependency>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.28</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
            <version>2.5.9</version>
        </dependency>

2.配置文件

# 數(shù)據(jù)庫(kù)驅(qū)動(dòng):
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
# 數(shù)據(jù)庫(kù)連接地址
spring.datasource.url=jdbc:mysql://localhost:3306/數(shù)據(jù)庫(kù)?serverTimezone=UTC
# 數(shù)據(jù)庫(kù)用戶(hù)名&密碼:
spring.datasource.username=用戶(hù)名
spring.datasource.password=密碼
spring.main.allow-circular-references=true
# redis地址
spring.redis.host=localhost
spring.redis.port=6379

3.示例代碼

實(shí)體類(lèi)代碼:

@TableName(value ="phone")
@AllArgsConstructor
@NoArgsConstructor
@Data
public class Phone implements Serializable {
    /**
     * 
     */
    @TableId(type = IdType.AUTO)
    private Integer id;
    /**
     * 
     */
    private String number;
    /**
     * 
     */
    private String password;

controller層代碼:

//    記錄登錄失敗次數(shù) 登錄失敗次數(shù)大于5次 限制登錄一分鐘
    @RequestMapping("relogin")
    public String relogin(String number,String password) {
        String key = "login:";
        String loginkey="fail"+number;
        LambdaQueryWrapper<Phone> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.eq(Phone::getNumber,number);
        queryWrapper.eq(Phone::getPassword,password);
        Phone phones = phoneService.getOne(queryWrapper);
        if (phones!=null){
            redisTemplate.delete(key);
            redisTemplate.delete(loginkey);
            return "登陸成功";
        }
        redisTemplate.opsForValue().increment(key);
        redisTemplate.expire(key,1,TimeUnit.MINUTES);
        redisTemplate.opsForValue().set(loginkey, String.valueOf(System.currentTimeMillis()),1,TimeUnit.MINUTES);
        String loginNumStr = redisTemplate.opsForValue().get(key);
        Integer loginNum = (loginNumStr != null) ? Integer.parseInt(loginNumStr) : 0;
        if (loginNum != null && loginNum >= 5) {
            long localtime = System.currentTimeMillis();
            long failtime = Long.parseLong(redisTemplate.opsForValue().get(loginkey));
            long time = localtime - failtime;
            if(time<60000){
                return "您的登錄失敗次數(shù)已經(jīng)至少5次,請(qǐng)一分鐘后重試";
            }
        }
        return "登陸失敗";
    }

下面我來(lái)逐步解釋代碼的功能和邏輯:

  • 首先,方法的簽名是 relogin(String number, String password),表明它接收一個(gè)手機(jī)號(hào)碼和密碼作為輸入?yún)?shù)。
  • 在方法內(nèi)部,首先定義了兩個(gè)字符串變量:key 和 loginkey。key 的值是 “login:”,loginkey 的值是 “fail” 加上用戶(hù)提供的手機(jī)號(hào)碼。
  • 使用 Lambda 表達(dá)式創(chuàng)建了一個(gè)查詢(xún)條件 LambdaQueryWrapper queryWrapper,用于查詢(xún)數(shù)據(jù)庫(kù)中是否存在指定手機(jī)號(hào)碼和密碼的用戶(hù)記錄。
  • 執(zhí)行查詢(xún)操作 phoneService.getOne(queryWrapper),將結(jié)果存儲(chǔ)在 phones 變量中。
  • 如果查詢(xún)結(jié)果不為 null(即找到了匹配的用戶(hù)記錄),則執(zhí)行以下操作:
  • 刪除 Redis 中存儲(chǔ)的與登錄相關(guān)的鍵值對(duì),包括 key 和 loginkey。
  • 返回字符串 “登陸成功”。
  • 如果查詢(xún)結(jié)果為 null(未找到匹配的用戶(hù)記錄),則執(zhí)行以下操作:
  • 使用 Redis 記錄登錄失敗次數(shù)。通過(guò)遞增 key 對(duì)應(yīng)的值,記錄當(dāng)前登錄失敗的次數(shù)并且設(shè)置過(guò)期時(shí)間為一分鐘。
  • 使用 Redis 存儲(chǔ)登錄失敗的時(shí)間戳,以便后續(xù)檢查登錄失敗次數(shù)是否達(dá)到上限。
  • 通過(guò)獲取 key 對(duì)應(yīng)的值,檢查當(dāng)前登錄失敗的次數(shù)。如果登錄失敗次數(shù)達(dá)到或超過(guò) 5 次,進(jìn)入以下判斷:
  • 獲取當(dāng)前時(shí)間和最近一次登錄失敗的時(shí)間之間的時(shí)間差 time。
  • 如果時(shí)間差小于 60000 毫秒(即一分鐘),則返回提示信息:“您的登錄失敗次數(shù)已經(jīng)超過(guò)5次,請(qǐng)一分鐘后重試”。
  • 如果以上條件都不滿(mǎn)足,則返回 “登陸失敗”。

總結(jié)

在本博客中,我們已經(jīng)探討如何利用Redis來(lái)實(shí)現(xiàn)鎖定賬戶(hù)的安全措施,以及通過(guò)SpringBoot整合Redis實(shí)現(xiàn)了這一功能。具體的高級(jí)用法還需小伙伴們?nèi)ド钊胙芯俊?/p>

到此這篇關(guān)于SpringBoot整合Redis實(shí)現(xiàn)登錄失敗鎖定功能的文章就介紹到這了,更多相關(guān)SpringBoot Redis登錄失敗鎖定內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java中public關(guān)鍵字用法詳細(xì)講解

    Java中public關(guān)鍵字用法詳細(xì)講解

    這篇文章主要給大家介紹了關(guān)于Java中public關(guān)鍵字用法的相關(guān)資料,public關(guān)鍵字是和訪(fǎng)問(wèn)權(quán)限相關(guān)的,它所修飾的方法對(duì)所有類(lèi)都是可以訪(fǎng)問(wèn)的,需要的朋友可以參考下
    2023-09-09
  • Java中==運(yùn)算符與equals方法的區(qū)別及intern方法詳解

    Java中==運(yùn)算符與equals方法的區(qū)別及intern方法詳解

    這篇文章主要介紹了Java中==運(yùn)算符與equals方法的區(qū)別及intern方法詳解的相關(guān)資料,需要的朋友可以參考下
    2017-04-04
  • Java中的OkHttpClient 工具類(lèi)

    Java中的OkHttpClient 工具類(lèi)

    這篇文章主要介紹了Java中的OkHttpClient工具類(lèi),具有很好的參考價(jià)值,希望杜大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-06-06
  • java web將數(shù)據(jù)導(dǎo)出為pdf格式文件代碼片段

    java web將數(shù)據(jù)導(dǎo)出為pdf格式文件代碼片段

    這篇文章主要為大家詳細(xì)介紹了java web將數(shù)據(jù)導(dǎo)出為pdf格式文件代碼片段,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-01-01
  • Mybatis參數(shù)(Parameters)傳遞方式

    Mybatis參數(shù)(Parameters)傳遞方式

    這篇文章主要介紹了Mybatis參數(shù)(Parameters)傳遞方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-12-12
  • Java使用Runnable和Callable實(shí)現(xiàn)多線(xiàn)程的區(qū)別詳解

    Java使用Runnable和Callable實(shí)現(xiàn)多線(xiàn)程的區(qū)別詳解

    這篇文章主要為大家詳細(xì)介紹了Java使用Runnable和Callable實(shí)現(xiàn)多線(xiàn)程的區(qū)別之處,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起了解一下
    2022-07-07
  • 分析 Java Stream 的 peek使用實(shí)踐與副作用處理方案

    分析 Java Stream 的 peek使用實(shí)踐與副作用處理方案

    Stream API的peek操作是中間操作,用于觀(guān)察元素但不終止流,其副作用風(fēng)險(xiǎn)包括線(xiàn)程安全、順序混亂及性能問(wèn)題,合理使用場(chǎng)景有限,本文給大家介紹Java Stream的peek使用實(shí)踐與副作用,感興趣的朋友跟隨小編一起看看吧
    2025-09-09
  • Java調(diào)用本地庫(kù)的JNA快速入門(mén)教程

    Java調(diào)用本地庫(kù)的JNA快速入門(mén)教程

    JNA(Java Native Access)是Java庫(kù),簡(jiǎn)化調(diào)用操作系統(tǒng)API,本文通過(guò)一個(gè)示例項(xiàng)目展示了如何使用JNA與C/C++編寫(xiě)的DLL交互,包括定義原生接口、數(shù)據(jù)類(lèi)型映射、指針和引用的處理、結(jié)構(gòu)體的使用以及異常處理等,感興趣的朋友一起看看吧
    2025-09-09
  • 關(guān)于Selenium的UI自動(dòng)化測(cè)試屏幕截圖功能實(shí)例代碼

    關(guān)于Selenium的UI自動(dòng)化測(cè)試屏幕截圖功能實(shí)例代碼

    今天小編就為大家分享一篇關(guān)于Selenium的UI自動(dòng)化測(cè)試屏幕截圖功能實(shí)例代碼,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-05-05
  • Java編寫(xiě)實(shí)現(xiàn)坦克大戰(zhàn)小游戲

    Java編寫(xiě)實(shí)現(xiàn)坦克大戰(zhàn)小游戲

    這篇文章主要為大家詳細(xì)介紹了Java編寫(xiě)實(shí)現(xiàn)坦克大戰(zhàn)小游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-01-01

最新評(píng)論

元阳县| 漠河县| 沙坪坝区| 都兰县| 汉阴县| 五河县| 城口县| 宿迁市| 荣昌县| 新郑市| 黑龙江省| 永城市| 元朗区| 榕江县| 寿光市| 青州市| 正宁县| 峨山| 白玉县| 长白| 红安县| 宝鸡市| 奉贤区| 泾源县| 巴彦淖尔市| 旅游| 如皋市| 汉寿县| 霍林郭勒市| 德令哈市| 余庆县| 石柱| 上杭县| 陆丰市| 武宁县| 龙陵县| 忻城县| 清远市| 修武县| 北川| 江永县|