在线不卡日本ⅴ一区v二区_精品一区二区中文字幕_天堂v在线视频_亚洲五月天婷婷中文网站

  • <menu id="lky3g"></menu>
  • <style id="lky3g"></style>
    <pre id="lky3g"><tt id="lky3g"></tt></pre>

    SpringBoot校驗(yàn)手機(jī)驗(yàn)證碼例:默認(rèn)緩存、數(shù)據(jù)淘汰策略、redis緩存

    SpringBoot校驗(yàn)手機(jī)驗(yàn)證碼例:默認(rèn)緩存、數(shù)據(jù)淘汰策略、redis緩存

    目錄

    案例實(shí)現(xiàn)功能:

    1 根據(jù)手機(jī)號(hào)碼 生成6位數(shù) 的數(shù)字 驗(yàn)證碼

    2 輸入手機(jī)號(hào)和驗(yàn)證碼, 判斷輸入的驗(yàn)證碼是否正確

    一 默認(rèn)緩存

    1.1 主要代碼

    1 添加依賴

    org.springframework.bootspring-boot-starter-cache

    2 啟用緩存

    3 實(shí)體類

    package com.qing.bean;import lombok.Data;@Datapublic class SMSCode { private String phoneNum; private String code;}

    4 創(chuàng)建驗(yàn)證碼的工具

    package com.qing.util;import org.springframework.cache.annotation.Cacheable;import org.springframework.stereotype.Component;@Componentpublic class CodeUtils { public String generate(String phoneNum) { int hash = phoneNum.hashCode(); int encryption = 2022630; //異或加密:一種通過異或運(yùn)算進(jìn)行加密的算法 //轉(zhuǎn)成二進(jìn)制,運(yùn)算規(guī)則:相同為0,不同為1,再轉(zhuǎn)成十進(jìn)制 long result = hash ^ encryption; long nowTime = System.currentTimeMillis(); result = result ^ nowTime; long code = result % 1000000; //處理有負(fù)數(shù)的情況 code = code < 0 ? -code : code; //六位數(shù):前面補(bǔ)0 String.format("%06d",code); return code + ""; } //獲取緩存里的驗(yàn)證碼 @Cacheable(key ="#phoneNum" ,value = "cacheCode") public String getCacheCode(String phoneNum){ return null; }}

    關(guān)于異或運(yùn)算請(qǐng)點(diǎn)這里

    說明:getCacheCode()獲取緩存里的驗(yàn)證碼的方法,寫在工具類這里是因?yàn)橐箂pring的@Cacheable這個(gè)注解生效,需要注入spring容器,該工具類在后面的ServiceImpl進(jìn)行了注入,該方法返回的是注解@Cacheable的value屬性值 cacheCode ( 詳見后面的測試 )

    5 service

    package com.qing.service;import com.qing.bean.SMSCode;public interface SMSCodeService { //發(fā)送驗(yàn)證碼 String sendCode(String phoneNum); //檢查驗(yàn)證碼 boolean checkCode(SMSCode smsCode);}

    6 serviceImpl

    package com.qing.service.impl;import com.qing.bean.SMSCode;import com.qing.service.SMSCodeService;import com.qing.util.CodeUtils;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.cache.annotation.CachePut;import org.springframework.stereotype.Service;@Servicepublic class SMSCodeServiceImpl implements SMSCodeService { @Autowired CodeUtils codeUtils; //發(fā)送驗(yàn)證碼 @Override //只往里放,不往外讀 @CachePut(key = “#phoneNum”, value = “cacheCode”) public String sendCode(String phoneNum) { return codeUtils.generate(phoneNum); } //比對(duì)驗(yàn)證碼 @Override public boolean checkCode(SMSCode smsCode) { //取出內(nèi)存中的驗(yàn)證碼與傳遞過來的驗(yàn)證碼比對(duì),相同返回true String code = smsCode.getCode(); String cacheCode = codeUtils.getCacheCode(smsCode.getPhoneNum()); return code.equals(cacheCode); }}

    7 controller

    package com.qing.controller;import com.qing.bean.SMSCode;import com.qing.service.SMSCodeService;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.web.bind.annotation.*;@RestController@RequestMapping(“/sms”)public class SMSCodeController { @Autowired private SMSCodeService smsCodeService; @GetMapping(“/{phoneNum}”) public String getCode(@PathVariable String phoneNum){ return smsCodeService.sendCode(phoneNum); } @PostMapping public boolean checkCode(@RequestBody SMSCode smsCode) { return smsCodeService.checkCode(smsCode); }}

    1.2 測試

    1 生成驗(yàn)證碼

    2 輸入錯(cuò)的驗(yàn)證碼驗(yàn)證

    3 輸入正確的驗(yàn)證碼

    4 再次生成驗(yàn)證

    二 Ehcache緩存

    在默認(rèn)緩存案例的基礎(chǔ)上做3個(gè)配置就行

    1 加依賴

    net.sf.ehcache ehcache

    2 配置文件

    3 ehcache.xml放在resources下

    默認(rèn)緩存

    配置新的緩存: name 要和@CachePut注解的的value的屬性值一樣

    數(shù)據(jù)淘汰策略

    下圖表示的信息:

    1 下面的時(shí)間分別表示最后一次訪問是在 第幾秒訪問的

    2 上面的數(shù)字表示 訪問了幾次

    LRU:age 是上次訪問離現(xiàn)在的時(shí)間最遠(yuǎn)的

    LFU:gender 訪問次數(shù)是最少的

    四 redis緩存

    4.1 基礎(chǔ)使用

    在默認(rèn)緩存的基礎(chǔ)上加2個(gè)配置

    1 導(dǎo)入依賴

    org.springframework.boot spring-boot-starter-data-redis

    2 配置文件

    測試

    打開redis的服務(wù)端和客戶端

    關(guān)于redis的安裝和簡單使用在這里

    生成一次驗(yàn)證碼

    數(shù)據(jù)已經(jīng)進(jìn)到redis緩存里了

    緩存的名字即這個(gè)value屬性的值 和 key 電話號(hào)碼組合成一個(gè)新的key一起放進(jìn)redis緩存里

    再生成一次驗(yàn)證碼

    redis又多了一個(gè)緩存數(shù)據(jù)

    4.2 其他配置

    測有效時(shí)間 10s

    看一下測試效果

    10s之后緩存里的驗(yàn)證碼失效了

    備注: 超過了有效時(shí)長,redis數(shù)據(jù)里就沒有那個(gè)緩存了

    測前綴

    總結(jié)

    原文 https://blog.csdn.net/m0_45877477/article/details/125539400

    鄭重聲明:本文內(nèi)容及圖片均整理自互聯(lián)網(wǎng),不代表本站立場,版權(quán)歸原作者所有,如有侵權(quán)請(qǐng)聯(lián)系管理員(admin#wlmqw.com)刪除。
    用戶投稿
    上一篇 2022年7月11日 15:21
    下一篇 2022年7月11日 15:22

    相關(guān)推薦

    聯(lián)系我們

    聯(lián)系郵箱:admin#wlmqw.com
    工作時(shí)間:周一至周五,10:30-18:30,節(jié)假日休息