今天我們講一下在 Java 中驗(yàn)證碼的使用。
驗(yàn)證碼生成
本效果是利用easy-captcha工具包實(shí)現(xiàn),首先需要添加相關(guān)依賴到pom.xml中,代碼如下:
< dependency >
< groupId >com.github.whvcse< /groupId >
< artifactId >easy-captcha< /artifactId >
< version >1.6.2< /version >
< /dependency >
驗(yàn)證碼格式
easy-captcha驗(yàn)證碼工具支持GIF、中文、算術(shù)等類型,分別通過下面幾個實(shí)例對象實(shí)現(xiàn):
- SpecCaptcha(PNG類型的靜態(tài)圖片驗(yàn)證碼)
- GifCaptcha(Gif類型的圖片驗(yàn)證碼)
- ChineseCaptcha(GIF類型中文圖片驗(yàn)證碼)
- ArithmeticCaptcha(算術(shù)類型的圖片驗(yàn)證碼)
字符類型分為以下幾種:
- TYPE_DEFAULT:數(shù)字和字母混合
- TYPEONLYNUMBER:純數(shù)字
- TYPEONLYCHAR:純字母
- TYPEONLYUPPER:純大寫字母
- TYPEONLYLOWER:純小寫字母
- TYPENUMAND_UPPER:數(shù)字和大寫字母混合
后端邏輯的實(shí)現(xiàn)
package com.yanx.controller;
import com.wf.captcha.SpecCaptcha;
import com.wf.captcha.base.Captcha;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.thymeleaf.util.StringUtils;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@Controller
public class KapchaController {
@GetMapping("/kaptcha")
public void defaultKaptcha(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws IOException {
httpServletResponse.setHeader("Cache-Control","no-store");
httpServletResponse.setHeader("Pragma","no-cache");
httpServletResponse.setDateHeader("Expires",0);
httpServletResponse.setContentType("image/gif");
//三個參數(shù)分別為寬、高、位數(shù)
SpecCaptcha captcha=new SpecCaptcha(75,30,4);
//設(shè)置類型為數(shù)字和字母混合
captcha.setCharType(Captcha.TYPE_DEFAULT);
//設(shè)置字體
captcha.setCharType(Captcha.FONT_9);
//驗(yàn)證碼存入session
httpServletRequest.getSession().setAttribute("verifyCode",captcha.text().toLowerCase());
//輸出圖片流
captcha.out(httpServletResponse.getOutputStream());
}
}
這里控制器新增了defaultKaptcha()方法,該方法所攔截處理的路徑為/kaptcha
前端邏輯的實(shí)現(xiàn)
在static目錄中新建kaptcha.html頁面,代碼如下:
< !DOCTYPE html >
< html lang="en" >
< head >
< meta charset="UTF-8" >
< title >驗(yàn)證碼< /title >
< /head >
< body >
< img src="/kaptcha" onclick="this.src='/kaptcha?t=new Date()'" >
< /body >
< /html >
訪問后端驗(yàn)證碼路徑/kaptcha,驗(yàn)證碼為圖片形式。onclick方法為點(diǎn)擊該標(biāo)簽時可以動態(tài)切換顯示驗(yàn)證碼。
啟動Spring Boot項目,打開瀏覽器輸入地址:
http://localhost:8080/kaptcha.html
效果如下:

驗(yàn)證碼驗(yàn)證
后端代碼
package com.yanx.controller;
import com.wf.captcha.SpecCaptcha;
import com.wf.captcha.base.Captcha;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.thymeleaf.util.StringUtils;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
@Controller
public class KapchaController {
@GetMapping("/kaptcha")
public void defaultKaptcha(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws IOException {
httpServletResponse.setHeader("Cache-Control","no-store");
httpServletResponse.setHeader("Pragma","no-cache");
httpServletResponse.setDateHeader("Expires",0);
httpServletResponse.setContentType("image/gif");
//三個參數(shù)分別為寬、高、位數(shù)
SpecCaptcha captcha=new SpecCaptcha(75,30,4);
//設(shè)置類型為數(shù)字和字母混合
captcha.setCharType(Captcha.TYPE_DEFAULT);
//設(shè)置字體
captcha.setCharType(Captcha.FONT_9);
//驗(yàn)證碼存入session
httpServletRequest.getSession().setAttribute("verifyCode",captcha.text().toLowerCase());
//輸出圖片流
captcha.out(httpServletResponse.getOutputStream());
}
@GetMapping("/verify")
@ResponseBody
public String verify(@RequestParam("code") String code, HttpSession session){
if(StringUtils.isEmpty(code)){
return "驗(yàn)證碼不能為空";
}
String kapchaCode = session.getAttribute("verifyCode")+"";
if(StringUtils.isEmpty(kapchaCode)||!code.toLowerCase().equals(kapchaCode)){
return "驗(yàn)證碼輸入錯誤";
}
return "驗(yàn)證成功";
}
}
前端代碼
< !DOCTYPE html >
< html lang="en" >
< head >
< meta charset="UTF-8" >
< title >驗(yàn)證碼驗(yàn)證< /title >
< /head >
< body >
< img src="/kaptcha" onclick="this.src='/kaptcha?d=new Date()'" >
< br >
< input type="text" maxlength="5" id="code" placeholder="請輸入驗(yàn)證碼"/ >
< button id="verify" >驗(yàn)證< /button >
< br/ >
< p id="verifyResult" >< /p >
< /body >
< script src="https://s3.pstatp.com/cdn/expire-1-M/jquery/3.3.1/jquery.min.js" >< /script >
< script type="text/javascript" >
$(function(){
//驗(yàn)證按鈕點(diǎn)擊事件
$('#verify').click(function(){
var code=$('#code').val();
$.ajax({
type:'GET',//方法類型
url:'/verify?code='+code,
success:function(result){
$('#verifyResult').html(result);
},
error:function(){
alert('請求失敗');
},
});
});
});
< /script >
< /html >
效果



結(jié)束語
生成驗(yàn)證碼功能還是比較常用的,所以記錄整理一下,方便以后回顧,如果有幫到你們的地方倍感榮幸,有路過的大佬還望不吝雅教!
聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。
舉報投訴
-
JAVA
+關(guān)注
關(guān)注
20文章
2997瀏覽量
116050 -
瀏覽器
+關(guān)注
關(guān)注
1文章
1043瀏覽量
37006 -
代碼
+關(guān)注
關(guān)注
30文章
4955瀏覽量
73490 -
驗(yàn)證碼
+關(guān)注
關(guān)注
2文章
20瀏覽量
4876
發(fā)布評論請先 登錄
相關(guān)推薦
熱點(diǎn)推薦
無法驗(yàn)證郵箱,總是提示驗(yàn)證碼錯誤,驗(yàn)證碼明明是正確的。
`無法驗(yàn)證郵箱,總是提示驗(yàn)證碼錯誤,驗(yàn)證碼明明是正確的。是不是系統(tǒng)的bug?`
發(fā)表于 05-12 10:41
java圖形驗(yàn)證碼生成的設(shè)計實(shí)現(xiàn)
;/Kaptcha</url-pattern></servlet-mapping>html中添加驗(yàn)證碼標(biāo)簽,并綁定javascript事件:<
發(fā)表于 10-21 14:42
打碼平臺是如何高效的破解市面上各家驗(yàn)證碼平臺的各種形式驗(yàn)證碼的?
點(diǎn)選類驗(yàn)證碼。所以機(jī)器破解的主要方向是通過識別圖片中的相關(guān)驗(yàn)證要素來進(jìn)行破解,例如識別滑動驗(yàn)證碼的缺口,點(diǎn)選驗(yàn)證碼中的文字要素和數(shù)字要素,其
發(fā)表于 11-01 15:21
基于加密短信驗(yàn)證碼的移動安全支付解決方案
針對移動支付過程中支付驗(yàn)證碼容易泄露的問題,提出了基于加密短信息驗(yàn)證碼的雙因素移動支付系統(tǒng)方案。該方案基于公開密鑰系統(tǒng),使用公鑰基礎(chǔ)設(shè)施/認(rèn)證機(jī)構(gòu)( PKI/CA)的認(rèn)證方法進(jìn)行服務(wù)器與客戶端的在線
發(fā)表于 11-29 14:40
?0次下載
多樣變換的手寫驗(yàn)證碼自動識別算法
研究驗(yàn)證碼自動識別技術(shù)可以進(jìn)一步提升人識別驗(yàn)證碼的可讀性,增強(qiáng)機(jī)器識別的難度,從而提高網(wǎng)絡(luò)安全性。針對目前提出的驗(yàn)證碼識別方法基本都是采用光學(xué)字符識別(OCR)方法對機(jī)器寫的標(biāo)準(zhǔn)字符進(jìn)行識別,本文
發(fā)表于 12-20 14:14
?0次下載
以一個真實(shí)網(wǎng)站的驗(yàn)證碼為例,實(shí)現(xiàn)了基于一下KNN的驗(yàn)證碼識別
很多網(wǎng)站登錄都需要輸入驗(yàn)證碼,如果要實(shí)現(xiàn)自動登錄就不可避免的要識別驗(yàn)證碼。本文以一個真實(shí)網(wǎng)站的驗(yàn)證碼為例,實(shí)現(xiàn)了基于一下KNN的驗(yàn)證碼識別。
如何使用Python機(jī)器學(xué)習(xí)解決驗(yàn)證碼的資料說明
寫爬蟲有一個繞不過去的問題就是驗(yàn)證碼,現(xiàn)在驗(yàn)證碼分類大概有4種:
圖像類
滑動類
點(diǎn)擊類
語音類
驗(yàn)證碼層出不窮?試試這個自動跳過驗(yàn)證碼的工具
目前網(wǎng)絡(luò)上越來越多使用驗(yàn)證碼了,驗(yàn)證碼的本意是阻止機(jī)器刷流量擠占服務(wù)器資源,這本來無可厚非;但是驗(yàn)證碼已經(jīng)變得越來越過分,別說機(jī)器人了,連人也經(jīng)常沒法辨認(rèn)!這就相當(dāng)煩了,特別是被廣泛使用更多
驗(yàn)證碼太麻煩,自動跳過驗(yàn)證碼神器試一試
目前網(wǎng)絡(luò)上越來越多使用驗(yàn)證碼了,驗(yàn)證碼的本意是阻止機(jī)器刷流量擠占服務(wù)器資源,這本來無可厚非;但是驗(yàn)證碼已經(jīng)變得越來越過分,別說機(jī)器人了,連人也經(jīng)常沒法辨認(rèn)! 這就相當(dāng)煩了,特別是被廣泛使用更多
帶帶弟弟OCR通用驗(yàn)證碼識別SDK免費(fèi)開源版
在使用爬蟲登錄網(wǎng)站的時候,經(jīng)常輸入用戶名和密碼后會遇到驗(yàn)證碼,簡單一點(diǎn)的有字母驗(yàn)證碼,復(fù)雜一點(diǎn)的有滑塊驗(yàn)證碼,點(diǎn)選文章和點(diǎn)選圖片驗(yàn)證碼。這些都是爬蟲
一個短信驗(yàn)證碼爆破重置
以前倒是遇到過不少四位數(shù)驗(yàn)證碼爆破的,但是這種可以結(jié)合短信遍歷,一個短信驗(yàn)證碼只能驗(yàn)證三次的,最后能成功利用的還是第一次遇到,關(guān)鍵還是這里不存在圖片驗(yàn)證碼或者行為
Java 中驗(yàn)證碼的使用
評論