驗證碼實現

驗證碼案例

學了Spring MVC ,配置 相關章節, 現可以嘗試寫一個前后端交互的驗證碼


文章目錄

  • 驗證碼案例
  • 前言
  • 一、驗證碼是什么?
  • 二、需求
    • 1.引入依賴
    • 2.導入前端頁面
    • 3.約定前后段交互接口
  • 三、代碼解析
    • Controller
    • model
    • application.xml
  • 四丶結果
  • 五丶總結


前言

提示:這里可以添加本文要記錄的大概內容:

頁面如下圖所示
1.頁面生成驗證碼
2.輸入驗證碼,點擊提交,驗證用戶輸入驗證碼是否正確,正確則頁面跳轉

在這里插入圖片描述


提示:以下是本篇文章正文內容,下面案例可供參考

一、驗證碼是什么?

驗證碼,是來區分用戶是計算機還是人的公共全自動程序,可以防止:惡意破解密碼,刷票,等有效防止某個黑客對特定用戶進行暴力登錄,這個問題必須只有人類才能解答,驗證碼花樣百出,下面我們將采用扭曲干擾驗證碼來實現前后端交互的接口在這里插入圖片描述

二、需求

1.引入依賴

代碼如下(示例):

<dependencies>//SpingWeb 框架<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency>// lombok 自動生成<dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional></dependency>//test 測試方法<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency>//驗證碼 相關的類 封裝好了的 直接用<dependency><groupId>cn.hutool</groupId><artifactId>hutool-captcha</artifactId><version>5.8.26</version></dependency></dependencies>

把這段代碼加入pom.xml文件中即可,但是要把里面的注釋刪了 ,否則會出錯

2.導入前端頁面

代碼如下(示例):
index.html

<!DOCTYPE html>
<html lang="en"><head><meta charset="utf-8"><title>驗證碼</title><style>#inputCaptcha {height: 30px;vertical-align: middle; }#verificationCodeImg{vertical-align: middle; }#checkCaptcha{height: 40px;width: 100px;}</style>
</head><body><h1>輸入驗證碼</h1><div id="confirm"><input type="text" name="inputCaptcha" id="inputCaptcha"><img id="verificationCodeImg" src="/captcha/getCaptcha" style="cursor: pointer;" title="看不清?換一張" /><input type="button" value="提交" id="checkCaptcha"></div><script src="https://code.jquery.com/jquery-3.7.1.min.js"></script><script>$("#verificationCodeImg").click(function(){$(this).hide().attr('src', '/captcha/getCaptcha?dt=' + new Date().getTime()).fadeIn();});$("#checkCaptcha").click(function () {$.ajax({url:"/captcha/check",type:"post",data:{captcha:$("#inputCaptcha").val()},success: function(result){if(result==true){location.href="/success.html"}else{alert("驗證碼錯誤");}}})});});</script>
</body></html>

success.html

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>驗證成功頁</title>
</head>
<body><h1>驗證成功</h1>
</body>
</html>

3.約定前后段交互接口

需求分析
后端需要提供兩個服務

  1. 生成驗證碼,并返回驗證碼;
  2. 校驗驗證碼是否正確;

接口定義
1.生成驗證碼
請求:

請求URL:/captcha/getCaptcha
響應:驗證碼圖片內容

2.校驗驗證碼是否正確
請求:

請求URL:/captcha/check
請求參數:captcha ,用戶傳過來的驗證碼
響應: true / false

三、代碼解析

Controller

@RestController
@RequestMapping("/captcha")
public class CaptchaController {//注入配置 對象 , 一些常量從里面讀取@Autowiredprivate CaptchaProperties cp;//易鳳種 華為msprivate static long VALID_TIME_OUT = 60*1000;@RequestMapping("/getCaptcha")public void getCaptcha(HttpSession session, HttpServletResponse response) {//生成驗證碼 ,并把驗證碼寫入瀏覽器中//定義圖形驗證碼的長和寬CircleCaptcha captcha = CaptchaUtil.createCircleCaptcha(cp.getWidth(), cp.getHeight(), cp.getCodeCount(), cp.getCilceCount());//打印驗證碼String code = captcha.getCode();System.out.println(code);//驗證碼 , 當前時間 存入Sessionsession.setAttribute(cp.getSession().getCode(), code);session.setAttribute(cp.getSession().getDate(), new Date());try {//把驗證碼寫到瀏覽器中captcha.write(response.getOutputStream());} catch (IOException e) {throw new RuntimeException(e);}}//校驗驗證碼,獲取生成的驗證碼 寫給Session@RequestMapping("/check")public boolean check(String captcha,HttpSession session) {//校驗是否為空,防止equls空指針if(!StringUtils.hasLength(captcha)){return false;}//從Session中讀取值String code = (String) session.getAttribute(cp.getSession().getCode());Date date = (Date) session.getAttribute(cp.getSession().getDate());//校驗獲取驗證碼的時間 和 校驗時間 的差值不能超過一分鐘if(date == null || (System.currentTimeMillis() - date.getTime()) > VALID_TIME_OUT){return false;}return captcha.equalsIgnoreCase(code);}
}

解析 :接口getCaptcha ,用來生成驗證碼(從hutool上面cv),那么如何將生成的驗證碼傳給另一個接口呢 ? 設置Session,response是用來把驗證碼寫入到文件/瀏覽器中的 ,前端用來改一下img中圖片的src屬性即可獲取
Controller 從model中獲取配置信息, 需要依賴注入 ,各種常量屬性,和存儲在Session中的“key

model

@Data
@Configuration
@ConfigurationProperties(prefix = "captcha")
//讀取配置的信息
public class CaptchaProperties {private Integer width;private Integer height;private Integer codeCount;private Integer cilceCount;private Session session;@Datapublic static class Session {private String code;private String date;}
}

配置對象的接口 ,用來獲取配置中的信息(對象) ,并封裝成一個類,需要用到@configurationproperties(“prefix="對象名"”)并且設置對象中的屬性,內部類 注意使用內部類 一般要加上 public static 或者會出現錯誤 具體原因后續再說
@Data 是用來生成 get/set 方法的,來自于lombok依賴

application.xml

captcha:width: 100height: 40codeCount: 4circleCount: 40Session:key: SESSION_CAPTCHA_KEYdate: SESSION_CAPTCHA_DATE

配置相關信息,配置了驗證碼的相關屬性,前后端交互時的Session , 使用 key - value 的形式

四丶結果

在這里插入圖片描述
點擊“提交”,跳轉頁面 成功!!
在這里插入圖片描述

五丶總結

問題:

  • HttpSErvletResponse 是什么 ? 為什么能寫入到瀏覽器 ?
  • 在驗證代碼時,在一個接口中把驗證碼傳給Session ,另一個接口為什么能從Session中獲取到?
  • 在使用內部類時, 為什么 要設置 public ? 為什么 要用static才能運行?
  • [ ]

注意:

  • System.currentTimeMillis() 表示當前時間 ,類型為long , 單位為ms

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

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

相關文章

查詢當前用戶的購物車和清空購物車

業務需求&#xff1a; 在小程序用戶端購物車頁面能查到當前用戶的所有菜品或者套餐 代碼實現 controller層 GetMapping("/list")public Result<List<ShoppingCart>> list(){List<ShoppingCart> list shoppingCartService.shopShoppingCart();r…

(多看) CExercise_05_1函數_1.2計算base的exponent次冪

題目&#xff1a; 鍵盤錄入兩個整數&#xff1a;底(base)和冪指數(exponent)&#xff0c;計算base的exponent次冪&#xff0c;并打印輸出對應的結果。&#xff08;注意底和冪指數都可能是負數&#xff09; 提示&#xff1a;求冪運算時&#xff0c;基礎的思路就是先無腦把指數轉…

【nacos安裝指南】

Nacos安裝指南 1.Windows安裝 開發階段采用單機安裝即可。 1.1.下載安裝包 在Nacos的GitHub頁面&#xff0c;提供有下載鏈接&#xff0c;可以下載編譯好的Nacos服務端或者源代碼&#xff1a; GitHub主頁&#xff1a;https://github.com/alibaba/nacos GitHub的Release下載…

通過發音學英語單詞:從音到形的學習方法

&#x1f4cc; 通過發音學英語單詞&#xff1a;從音到形的學習方法 英語是一種 表音語言&#xff08;phonetic language&#xff09;&#xff0c;但不像拼音文字&#xff08;如漢語拼音、西班牙語等&#xff09;那么規則&#xff0c;而是 部分表音部分表意。這意味著我們可以通…

列表某個字段由多個值組成,使用id匹配展示

說明&#xff1a;列表中字段A的值由多個值組成&#xff0c;但是后端返回的是這多個值的id字符串&#xff0c;需要前端拿著多個id組成的字符串去另一個接口數據源匹配展示 列表后端返回多個字符串如下&#xff1a; sectorName: "1899292545382895618,1907311191514636289…

MQL5教程 05 指標開發實戰:雙色線、雙線變色MACD、跨時間周期均線

文章目錄 一、雙色線指標二、雙線變色MACD指標三、跨時間周期均線 一、雙色線指標 這里的類型中&#xff0c;Color開頭的&#xff0c;是可以選擇多個顏色的。 #property indicator_chart_window #property indicator_buffers 18 #property indicator_plots 7 //--- plot xian…

Java全棧面試寶典:線程安全機制與Spring Boot核心原理深度解析

目錄 一、Java線程安全核心原理 &#x1f525; 問題1&#xff1a;線程安全的三要素與解決方案 線程安全風險模型 線程安全三要素 synchronized解決方案 &#x1f525; 問題2&#xff1a;synchronized底層實現全解析 對象內存布局 Mark Word結構&#xff08;64位系統&…

【Cursor】設置語言

Ctrl Shift P 搜索 configure display language選擇“中文-簡體”

【新能源汽車整車動力學模型深度解析:面向MATLAB/Simulink仿真測試工程師的硬核指南】

1. 前言 作為MATLAB/Simulink仿真測試工程師,掌握新能源汽車整車動力學模型的構建方法和實現技巧至關重要。本文將提供一份6000+字的深度技術解析,涵蓋從基礎理論到Simulink實現的完整流程。內容經過算法優化設計,包含12個核心方程、6大模塊實現和3種驗證方法,滿足SEO流量…

Java 線程池與 Kotlin 協程 高階學習

以下是Java 線程池與 Kotlin 協程 高階學習的對比指南&#xff0c;結合具體代碼示例&#xff0c;展示兩者在異步任務處理中的差異和 Kotlin 的簡化優勢&#xff1a; 分析&#xff1a; 首先&#xff0c;我們需要回憶Java中線程池的常見用法&#xff0c;比如通過ExecutorService創…

嵌入式EMC設計面試題及參考答案

目錄 解釋 EMC(電磁兼容性)的定義及其兩個核心方面(EMI 和 EMS) 電磁兼容三要素及相互關系 為什么產品必須進行 EMC 設計?列舉至少三個實際工程原因 分貝(dB)在 EMC 測試中的作用是什么?為何采用對數單位描述干擾強度? 傳導干擾與輻射干擾的本質區別及典型頻率范圍…

實操(進程狀態,R/S/D/T/t/X/Z)Linux

1 R 狀態并不直接代表進程在運行&#xff0c;而是該進程在運行隊列中進行排隊&#xff0c;由操作系統在內存維護的隊列 #include <stdio.h> #include <unistd.h>int main() {while(1){printf("我在運行嗎\n");sleep(1);}return 0; }查看狀態&#xff08…

React 文件上傳新玩法:Aliyun OSS 加持的智能上傳組件

文件上傳是前端開發中的“老朋友”&#xff0c;但如何讓它既簡單又強大&#xff0c;還能無縫對接云端存儲&#xff1f;今天&#xff0c;我要帶你認識一個超酷的 React 組件 AliUploader&#xff0c;它不僅支持拖拽上傳、批量編輯和文件排序&#xff0c;還直接把文件傳到 Aliyun…

LabVIEW多線程

在 LabVIEW 中&#xff0c;多線程編程是提升程序執行效率的關鍵手段&#xff0c;尤其是在需要并行處理數據采集、控制執行和用戶界面交互的場景下。LabVIEW 本身是基于數據流&#xff08;Dataflow&#xff09;的編程語言&#xff0c;天然支持多線程&#xff0c;但要高效利用多線…

圖解AUTOSAR_SWS_LINStateManager

AUTOSAR LIN狀態管理器(LinSM)詳細設計 文檔摘要 本文檔提供了AUTOSAR LIN狀態管理器(LinSM)模塊的詳細設計解析,包括架構、狀態機、睡眠喚醒流程以及配置結構。通過圖形化方式展現LinSM在AUTOSAR通信棧中的作用及其與其他模塊的交互關系。 目錄 AUTOSAR LIN狀態管理器(Lin…

python+form+opengl顯示動態圖形數據

說明&#xff1a; pythonformopengl顯示動態圖形數據 我希望做一款動態opengl圖形數據 1.用python腳本&#xff0c;輸入指定參數 2.生成一組數據&#xff0c; 3.將數據保持成本地文件 4.在c#中調用此文件&#xff0c;解析 5.將數據用opengl展示 效果圖: step1:添加依賴 C:\U…

Android Gradle、Android Gradle Plugin、BuildTool關系

1. Gradle 的定位&#xff1a;通用構建工具 Gradle 是一個通用的跨平臺構建工具&#xff0c;支持多種語言&#xff08;如 Java、Kotlin、C&#xff09;和項目類型 它的核心功能包括&#xff1a; ?任務自動化&#xff1a;通過 Groovy/Kotlin DSL 腳本定義編譯、測試、打包等…

DHCP之報文格式

字段說明&#xff1a; op (op code): 表示報文的類型&#xff0c;取值為 1 或 2&#xff0c;含義如下 1:客戶端請求報 2:服務器響應報文 Secs (seconds):由客戶端填充&#xff0c;表示從客戶端開始獲得 IP 地址或 IP 地址續借后所使用了的秒數&#xff0c;缺省值為 3600s。 F…

觀察者模式在Java微服務間的使用

一.、使用RabbitMQ來實現 (1) 生產者&#xff08;訂單微服務&#xff09; import org.springframework.amqp.rabbit.core.RabbitTemplate; import org.springframework.stereotype.Service;Service public class OrderService {private final RabbitTemplate rabbitTemplate;…

OSPF五種數據包詳解

一、OSPF頭部封裝 OSPF是跨四層封裝協議&#xff0c;直接封裝在網絡層之上&#xff0c;需要IP協議使用一個協議號來標定——89。 OSPF頭部結構&#xff1a; 版本&#xff1a;標識OSPF的版本&#xff0c;OSPFv2&#xff08;2&#xff09;、OSPFv3&#xff08;3&#xff09;&am…