SpringBoot中4種登錄驗證碼實現方案

文章目錄

  • 詳解
    • 方案一:基于kaptcha的圖形驗證碼
      • 實現步驟
    • 方案二:基于短信驗證碼
      • 實現步驟
    • 方案三:基于Spring Mail的郵箱驗證碼
      • 實現步驟
    • 方案四:基于AJ-Captcha的滑動拼圖驗證碼
      • 實現步驟
    • 總結

詳解

在Web應用中,驗證碼是防止惡意登錄、暴力破解等安全威脅的重要手段。SpringBoot提供了多種驗證碼實現方式,本文將介紹4種常見的登錄驗證碼方案,包括:

  1. 基于kaptcha的圖形驗證碼(傳統字符驗證)
  2. 基于短信驗證碼(手機號+短信驗證)
  3. 基于Spring Mail的郵箱驗證碼(郵箱+驗證碼)
  4. 基于AJ-Captcha的滑動拼圖驗證碼(行為驗證)

每種方案均提供核心實現思路,幫助開發者快速集成到項目中。


方案一:基于kaptcha的圖形驗證碼

適用場景:傳統Web登錄,適用于PC端,防止自動化腳本攻擊。

實現步驟

  1. 引入依賴(Maven)

    <dependency>  <groupId>com.github.penggle</groupId>  <artifactId>kaptcha</artifactId>  <version>2.3.2</version>  
    </dependency>  
    
  2. 配置Kaptchaapplication.yml或Java Config)

    @Configuration  
    public class KaptchaConfig {  @Bean  public DefaultKaptcha kaptcha() {  DefaultKaptcha kaptcha = new DefaultKaptcha();  Properties props = new Properties();  props.put("kaptcha.border", "no");  props.put("kaptcha.textproducer.font.color", "black");  props.put("kaptcha.textproducer.char.space", "4");  Config config = new Config(props);  kaptcha.setConfig(config);  return kaptcha;  }  
    }  
    
  3. 生成驗證碼接口

    @RestController  
    public class CaptchaController {  @Autowired  private DefaultKaptcha kaptcha;  @GetMapping("/captcha")  public void captcha(HttpServletResponse response) throws IOException {  String text = kaptcha.createText();  BufferedImage image = kaptcha.createImage(text);  // 存儲到Session或Redis  response.setContentType("image/jpeg");  OutputStream out = response.getOutputStream();  ImageIO.write(image, "jpg", out);  out.flush();  }  
    }  
    
  4. 登錄時校驗驗證碼

    @PostMapping("/login")  
    public String login(@RequestParam String captcha, HttpSession session) {  String storedCaptcha = (String) session.getAttribute("captcha");  if (!captcha.equalsIgnoreCase(storedCaptcha)) {  return "驗證碼錯誤!";  }  // 繼續登錄邏輯...  
    }  
    

方案二:基于短信驗證碼

適用場景:移動端登錄、手機號注冊,依賴短信服務商(如阿里云、騰訊云)。

實現步驟

  1. 引入短信SDK(以阿里云為例)

    <dependency>  <groupId>com.aliyun</groupId>  <artifactId>aliyun-java-sdk-core</artifactId>  <version>4.5.3</version>  
    </dependency>  
    
  2. 發送短信驗證碼

    @Service  
    public class SmsService {  public void sendSms(String phone, String code) {  // 調用阿里云/騰訊云短信API  System.out.println("發送短信驗證碼:" + code + " 至 " + phone);  }  
    }  
    
  3. 存儲驗證碼(Redis推薦)

    @Autowired  
    private RedisTemplate<String, String> redisTemplate;  public void saveSmsCode(String phone, String code) {  redisTemplate.opsForValue().set("sms:" + phone, code, 5, TimeUnit.MINUTES);  
    }  
    
  4. 登錄時校驗短信驗證碼

    @PostMapping("/sms-login")  
    public String smsLogin(@RequestParam String phone, @RequestParam String code) {  String storedCode = redisTemplate.opsForValue().get("sms:" + phone);  if (!code.equals(storedCode)) {  return "短信驗證碼錯誤!";  }  // 登錄邏輯...  
    }  
    

方案三:基于Spring Mail的郵箱驗證碼

適用場景:郵箱注冊、找回密碼,適用于企業郵箱或個人郵箱。

實現步驟

  1. 配置Spring Mailapplication.yml

    spring:  mail:  host: smtp.163.com  username: your-email@163.com  password: your-password  default-encoding: UTF-8  
    
  2. 發送郵件驗證碼

    @Service  
    public class EmailService {  @Autowired  private JavaMailSender mailSender;  public void sendEmailCode(String email, String code) {  SimpleMailMessage message = new SimpleMailMessage();  message.setTo(email);  message.setSubject("您的驗證碼");  message.setText("驗證碼:" + code + ",5分鐘內有效");  mailSender.send(message);  }  
    }  
    
  3. 存儲驗證碼(Redis)

    redisTemplate.opsForValue().set("email:" + email, code, 5, TimeUnit.MINUTES);  
    
  4. 登錄校驗

    @PostMapping("/email-login")  
    public String emailLogin(@RequestParam String email, @RequestParam String code) {  String storedCode = redisTemplate.opsForValue().get("email:" + email);  if (!code.equals(storedCode)) {  return "郵箱驗證碼錯誤!";  }  // 登錄邏輯...  
    }  
    

方案四:基于AJ-Captcha的滑動拼圖驗證碼

適用場景:防機器人攻擊,提升用戶體驗(無感驗證)。

實現步驟

  1. 引入依賴

    <dependency>  <groupId>com.anji-plus</groupId>  <artifactId>aj-captcha-springboot-starter</artifactId>  <version>1.3.0</version>  
    </dependency>  
    
  2. 配置AJ-Captchaapplication.yml

    aj:  captcha:  type: blockPuzzle  # 滑動拼圖  cache-type: redis  # 存儲方式  
    
  3. 前端集成(HTML + JS)

    <script src="https://cdn.jsdelivr.net/npm/aj-captcha"></script>  
    <div id="captcha"></div>  
    <script>  new AjCaptcha("#captcha", {  verify: function(data) {  // 提交驗證數據到后端  fetch("/verify-captcha", {  method: "POST",  body: JSON.stringify(data)  });  }  });  
    </script>  
    
  4. 后端校驗

    @PostMapping("/verify-captcha")  
    public boolean verifyCaptcha(@RequestBody CaptchaVO data) {  return captchaService.verification(data);  
    }  
    

總結

方案適用場景優點缺點
kaptchaPC端傳統登錄簡單易用可能被OCR破解
短信驗證碼手機號登錄安全性高依賴短信服務商,有成本
郵箱驗證碼郵箱注冊/找回密碼無額外費用依賴郵件服務器
AJ-Captcha防機器人攻擊用戶體驗好需要前端適配

開發者可根據業務需求選擇合適的驗證碼方案,甚至組合使用(如“圖形+短信”雙重驗證)。

源碼示例:GitHub鏈接

希望本文對您有所幫助!歡迎留言討論。 🚀

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/88329.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/88329.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/88329.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

基于版本控制+WORM的OSS數據保護:防勒索攻擊與法規遵從實踐

1. 數據保護的核心挑戰與解決方案架構 &#xff08;1&#xff09;現代數據保護的三大矛盾 勒索軟件進化 vs 傳統備份脆弱性&#xff1a;攻擊者已掌握備份系統刪除技術&#xff08;如vssadmin delete shadows&#xff09;法規保留要求&#xff08;GDPR第17條&#xff09;vs 技…

混合架構入門:如何選組合恰當的云 + 私有節點?

如果你最近剛開始搭建業務系統&#xff0c;或者準備從傳統IDC遷移到云上&#xff0c;你很可能已經被“混合云”、“多云”、“私有部署”這些概念繞得頭暈。而今天這篇文章&#xff0c;不會再羅列概念或抄定義&#xff0c;而是站在一個運維工程師、架構規劃者的角度&#xff0c…

CDN+OSS邊緣加速實踐:動態壓縮+智能路由降低30%視頻流量成本(含帶寬峰值監控與告警配置)

1 背景與挑戰分析 &#xff08;1&#xff09;流量成本結構剖析 視頻業務帶寬成本公式&#xff1a; C_{total} \sum_{i1}^{n} (P_{peak_i} T_i R_{region}) C_{req} N_{req}其中 P p e a k P_{peak} Ppeak? 為區域峰值帶寬&#xff08;GB/s&#xff09;&#xff0c; T …

Flink內存配置

通過本文可以解決以下3個問題。 了解flink內存和配置項相關概念。清楚UI中TM和JM各內存組件實際內存值的計算規則。根據實際情況對內存進行調整。 1. Flink進程內存 TM和JM二者均為JVM進程&#xff08;JVM通常分成堆內和堆外兩部分&#xff09;。TM和JM的內存定義為進程總內…

最新發布 | “龍躍”(MindLoongGPT)大模型正式發布!龍躍而起,推動中國方案走向全球智能體前沿

在人工智能快速演進的今天&#xff0c;生成式大模型正成為推動技術變革的核心引擎。繼語言、圖像、視頻等領域實現突破之后&#xff0c;下一階段的技術焦點&#xff0c;正加速向“具身智能”遷移。具身智能強調智能體對物理世界的感知、理解與互動能力&#xff0c;是實現通用人…

【系統分析師】2019年真題:論文及解題思路

文章目錄 試題一 論系統需求分析方法試題二 論系統自動化測試及其應用試題三 論處理流程設計方法及應用試題四 論企業智能運維技術與方法 試題一 論系統需求分析方法 系統需求分析是開發人員經過調研和分析&#xff0c;準確理解用戶和項目 的功能、性能、可靠 性等要求&#x…

在PHP環境下使用SQL Server的方法

當您處在PHP環境并想使用SQL Server作為數據庫服務器時&#xff0c;您需要將SQL Server連接到PHP。這涉及到一些步驟&#xff0c;我們會逐一說明并提供示例以指導你。 1.安裝SQL Server驅動&#xff1a; 首先&#xff0c;您需要在PHP環境中安裝對應的SQL Server驅動&#xff0…

RISC-V h拓展

https://tinylab.org/riscv-kvm-virt-mode-switch/ https://tinylab.org/riscv-kvm-virt-trap/ 特權模式 指令集中約定用虛擬化模式 V (virtualization mode) 來標記當前是否是在 Guest 系統中運行。V1 表示當前確實運行在 Guest 系統中&#xff0c;V0 則表示不運行在 Guest 中…

HCIA-華為VRP系統基礎

前言&#xff1a;本博客僅作記錄學習使用&#xff0c;部分圖片出自網絡&#xff0c;如有侵犯您的權益&#xff0c;請聯系刪除 本篇筆記是根據B站上的視頻教程整理而成&#xff0c;感謝UP主的精彩講解&#xff01;如果需要了解更多細節&#xff0c;可以參考以下視頻&#xff1a;…

OSS大數據分析集成:MaxCompute直讀OSS外部表優化查詢性能(減少數據遷移的ETL成本)

&#xff08;1&#xff09;數據存儲與分析分離的痛點 傳統架構中&#xff0c;OSS作為廉價存儲常與MaxCompute計算引擎分離&#xff0c;導致ETL遷移成本高企。某電商案例顯示&#xff1a;每日300TB日志從OSS導入MaxCompute內部表&#xff0c;產生以下問題&#xff1a; 延遲&…

vue | vue-macros 插件升級以及配置

Vue Macros 是一個為 Vue.js 提供更多宏和語法糖的開源項目vue-macros/vue-macros: Explore and extend more macros and syntax sugar to Vue. 問題&#xff1a;npm run build-only 打包時&#xff0c;報錯&#xff1a;[Vue] Load plugin failed: vue-macros/volar 排查發現…

瑞芯微elf2開發板(rk3588)實現ros2humble下部署yolov5模型與Astrapro相機集成實現目標檢測

版本信息總結以及工具介紹 組件版本說明RKNN Lite2.1.0嵌入式端推理庫RKNN Runtime2.1.0運行時庫 (967d001cc8)RKNN Driver0.9.8NPU驅動程序模型版本6RKNN模型格式版本工具鏈版本2.1.0708089d1模型轉換工具鏈Python3.10編程語言OpenCV4.x圖像處理庫目標平臺rk3588Rockchip RK3…

Web前端入門:JavaScript 事件循環機制中的微任務與宏任務

JS 是單線程語言。這句話對不對&#xff1f; 按照目前的情況來看&#xff0c;JS 自從支持了 Web Worker 之后&#xff0c;就不再是單線程語言了&#xff0c;但 Worker 的工作線程與主線程有區別&#xff0c;在 Worker 的工作線程中無法直接操作 DOM、window 對象或大多數瀏覽器…

【論文筆記】【強化微調】TinyLLaVA-Video-R1:小參數模型也能視頻推理

[2504.09641] TinyLLaVA-Video-R1: Towards Smaller LMMs for Video Reasoning 1. 引述 繼之前的一篇 Video-R1 的工作&#xff0c;一篇新的關于視頻推理的工作很快就上傳到 Arxiv 上 “占坑” 了&#xff0c;這個工作是關于使用小參數&#xff08;3B&#xff09;的 LLM 進行視…

基于元學習的回歸預測模型如何設計?

1. 核心設計原理 目標&#xff1a;學習一個可快速適應新任務的初始參數空間&#xff0c;使模型在少量樣本下泛化。數學基礎&#xff1a; MAML框架&#xff1a; min ? θ ∑ T ~ p ( T ) [ L T ( f θ ? η ? θ L T ( f θ ( D T t r a i n ) ) ( D T t e s t ) ) ] \min…

MyBatis Plus與P6Spy日志配置

前言 在開發基于Spring Boot和MyBatis Plus的項目時&#xff0c;日志功能是調試和優化SQL查詢的核心工具。通過合理配置日志輸出&#xff0c;開發者可以直觀查看生成的SQL語句、執行時間、參數值以及潛在的性能瓶頸。 一、MyBatis Plus日志配置 1.1 基礎配置&#xff1a;直接…

SpringCloudGateway(spel)漏洞復現 Spring + Swagger 接口泄露問題

環境配置 gateway Spring Cloud &#xff1a; 這個就是分布式的微服務組件 微服務 &#xff1a; 一般指的是獨立的&#xff0c;專注于一項功能的服務 Gateway 這個其實是個云端的網關配置&#xff08;他的作用就是對訪問web的流量進行防護比如一些爬蟲的阻截&#xff0…

服務器手動安裝并編譯R環境庫包:PROJ→RGDAL

目錄 方式1&#xff1a;conda-forge安裝錯誤&#xff1a;缺乏libnsl.so.1? 方法一&#xff1a;查找系統中是否已有此庫替補方案&#xff1a;采用libnsl.so.3鏈接 libnsl.so.1? 方法二&#xff1a;系統中沒有安裝 libnsl.so.1 → 手動安裝? 方法三&#xff1a;使用 Conda 安裝…

教育技術學讀計算機論文的提示詞

角色: 你是一位經驗豐富的計算機專業教授,擅長用通俗易懂的語言向初學者解釋復雜概念。我現在正在學習閱讀計算機科學領域的算法論文,但我的基礎比較薄弱(了解編程基礎如變量、循環、函數,了解一點數據結構和算法概念如數組、鏈表、排序,但對高級術語和數學證明不熟悉)。…

棋盤格標定板和圓形標定板的優劣性

來源&#xff1a;deepseek 在相機標定中&#xff0c;棋盤格標定板和圓形標定板&#xff08;或圓點陣列標定板&#xff09;是最常用的兩種類型。它們各有優劣&#xff0c;選擇哪種取決于具體的應用場景、需求以及使用的標定算法。以下是它們的主要優劣對比&#xff1a; &#…