0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

Java 中驗證碼的使用

科技綠洲 ? 來源:了不起 ? 作者:了不起 ? 2023-09-25 11:11 ? 次閱讀

今天我們講一下在 Java 中驗證碼的使用。

驗證碼生成

本效果是利用easy-captcha工具包實現(xiàn),首先需要添加相關(guān)依賴到pom.xml中,代碼如下:

< dependency >
    < groupId >com.github.whvcse< /groupId >
    < artifactId >easy-captcha< /artifactId >
    < version >1.6.2< /version >
< /dependency >

驗證碼格式

easy-captcha驗證碼工具支持GIF、中文、算術(shù)等類型,分別通過下面幾個實例對象實現(xiàn):

  • SpecCaptcha(PNG類型的靜態(tài)圖片驗證碼)
  • GifCaptcha(Gif類型的圖片驗證碼)
  • ChineseCaptcha(GIF類型中文圖片驗證碼)
  • ArithmeticCaptcha(算術(shù)類型的圖片驗證碼)

字符類型分為以下幾種:

  • TYPE_DEFAULT:數(shù)字和字母混合
  • TYPEONLYNUMBER:純數(shù)字
  • TYPEONLYCHAR:純字母
  • TYPEONLYUPPER:純大寫字母
  • TYPEONLYLOWER:純小寫字母
  • TYPENUMAND_UPPER:數(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);
 
        //驗證碼存入session
        httpServletRequest.getSession().setAttribute("verifyCode",captcha.text().toLowerCase());
 
        //輸出圖片流
        captcha.out(httpServletResponse.getOutputStream());
    }
 
}

這里控制器新增了defaultKaptcha()方法,該方法所攔截處理的路徑為/kaptcha

前端邏輯的實現(xiàn)

在static目錄中新建kaptcha.html頁面,代碼如下:

< !DOCTYPE html >
< html lang="en" >
< head >
    < meta charset="UTF-8" >
    < title >驗證碼< /title >
< /head >
< body >
 < img src="/kaptcha" onclick="this.src='/kaptcha?t=new Date()'" >
< /body >
< /html >

訪問后端驗證碼路徑/kaptcha,驗證碼為圖片形式。onclick方法為點擊該標(biāo)簽時可以動態(tài)切換顯示驗證碼。

啟動Spring Boot項目,打開瀏覽器輸入地址:

http://localhost:8080/kaptcha.html

效果如下:

圖片

驗證碼驗證

后端代碼

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);
 
        //驗證碼存入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 "驗證碼不能為空";
        }
        String kapchaCode = session.getAttribute("verifyCode")+"";
        if(StringUtils.isEmpty(kapchaCode)||!code.toLowerCase().equals(kapchaCode)){
            return "驗證碼輸入錯誤";
        }
        return "驗證成功";
    }
}

前端代碼

< !DOCTYPE html >
< html lang="en" >
< head >
    < meta charset="UTF-8" >
    < title >驗證碼驗證< /title >
< /head >
< body >
 
< img src="/kaptcha" onclick="this.src='/kaptcha?d=new Date()'" >
 
< br >
< input type="text" maxlength="5" id="code" placeholder="請輸入驗證碼"/ >
< button id="verify" >驗證< /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(){
  //驗證按鈕點擊事件
   $('#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é)束語

生成驗證碼功能還是比較常用的,所以記錄整理一下,方便以后回顧,如果有幫到你們的地方倍感榮幸,有路過的大佬還望不吝雅教!

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • JAVA
    +關(guān)注

    關(guān)注

    19

    文章

    2952

    瀏覽量

    104477
  • 瀏覽器
    +關(guān)注

    關(guān)注

    1

    文章

    1009

    瀏覽量

    35226
  • 代碼
    +關(guān)注

    關(guān)注

    30

    文章

    4722

    瀏覽量

    68229
  • 驗證碼
    +關(guān)注

    關(guān)注

    2

    文章

    20

    瀏覽量

    4685
收藏 人收藏

    評論

    相關(guān)推薦

    10種意想不到的驗證碼風(fēng)格設(shè)計

    simpleCaptcha玩具驗證碼,選一個吧。7. slideLock拖動滾動條來解鎖吧。8. Captcha PHP動畫驗證碼。9. NuCaptcha輸入flash視頻的紅字母就對了。10.
    發(fā)表于 05-05 14:03

    無法驗證郵箱,總是提示驗證碼錯誤,驗證碼明明是正確的。

    `無法驗證郵箱,總是提示驗證碼錯誤,驗證碼明明是正確的。是不是系統(tǒng)的bug?`
    發(fā)表于 05-12 10:41

    java圖形驗證碼生成的設(shè)計實現(xiàn)

    ;/Kaptcha</url-pattern></servlet-mapping>html添加驗證碼標(biāo)簽,并綁定javascript事件:<
    發(fā)表于 10-21 14:42

    平臺是如何高效的破解市面上各家驗證碼平臺的各種形式驗證碼的?

    點選類驗證碼。所以機(jī)器破解的主要方向是通過識別圖片中的相關(guān)驗證要素來進(jìn)行破解,例如識別滑動驗證碼的缺口,點選驗證碼的文字要素和數(shù)字要素,其
    發(fā)表于 11-01 15:21

    基于加密短信驗證碼的移動安全支付解決方案

    針對移動支付過程中支付驗證碼容易泄露的問題,提出了基于加密短信息驗證碼的雙因素移動支付系統(tǒng)方案。該方案基于公開密鑰系統(tǒng),使用公鑰基礎(chǔ)設(shè)施/認(rèn)證機(jī)構(gòu)( PKI/CA)的認(rèn)證方法進(jìn)行服務(wù)器與客戶端的在線
    發(fā)表于 11-29 14:40 ?0次下載
    基于加密短信<b class='flag-5'>驗證碼</b>的移動安全支付解決方案

    多樣變換的手寫驗證碼自動識別算法

    研究驗證碼自動識別技術(shù)可以進(jìn)一步提升人識別驗證碼的可讀性,增強(qiáng)機(jī)器識別的難度,從而提高網(wǎng)絡(luò)安全性。針對目前提出的驗證碼識別方法基本都是采用光學(xué)字符識別(OCR)方法對機(jī)器寫的標(biāo)準(zhǔn)字符進(jìn)行識別,本文
    發(fā)表于 12-20 14:14 ?0次下載

    SQLyog_12.4.1_帶驗證碼

    SQLyog_12.4.1_帶驗證碼.rar
    發(fā)表于 04-12 21:03 ?22次下載

    以一個真實網(wǎng)站的驗證碼為例,實現(xiàn)了基于一下KNN的驗證碼識別

    很多網(wǎng)站登錄都需要輸入驗證碼,如果要實現(xiàn)自動登錄就不可避免的要識別驗證碼。本文以一個真實網(wǎng)站的驗證碼為例,實現(xiàn)了基于一下KNN的驗證碼識別。
    的頭像 發(fā)表于 12-24 17:27 ?7734次閱讀

    如何使用Python機(jī)器學(xué)習(xí)解決驗證碼的資料說明

    寫爬蟲有一個繞不過去的問題就是驗證碼,現(xiàn)在驗證碼分類大概有4種: 圖像類 滑動類 點擊類 語音類
    的頭像 發(fā)表于 05-03 13:43 ?2277次閱讀

    驗證碼層出不窮?試試這個自動跳過驗證碼的工具

    目前網(wǎng)絡(luò)上越來越多使用驗證碼了,驗證碼的本意是阻止機(jī)器刷流量擠占服務(wù)器資源,這本來無可厚非;但是驗證碼已經(jīng)變得越來越過分,別說機(jī)器人了,連人也經(jīng)常沒法辨認(rèn)!這就相當(dāng)煩了,特別是被廣泛使用更多
    的頭像 發(fā)表于 11-15 10:42 ?5901次閱讀

    驗證碼太麻煩,自動跳過驗證碼神器試一試

    目前網(wǎng)絡(luò)上越來越多使用驗證碼了,驗證碼的本意是阻止機(jī)器刷流量擠占服務(wù)器資源,這本來無可厚非;但是驗證碼已經(jīng)變得越來越過分,別說機(jī)器人了,連人也經(jīng)常沒法辨認(rèn)! 這就相當(dāng)煩了,特別是被廣泛使用更多
    的頭像 發(fā)表于 11-15 11:15 ?1w次閱讀

    帶帶弟弟OCR通用驗證碼識別SDK免費開源版

    在使用爬蟲登錄網(wǎng)站的時候,經(jīng)常輸入用戶名和密碼后會遇到驗證碼,簡單一點的有字母驗證碼,復(fù)雜一點的有滑塊驗證碼,點選文章和點選圖片驗證碼。這些都是爬蟲
    的頭像 發(fā)表于 03-30 17:26 ?4592次閱讀

    一個短信驗證碼爆破重置

    以前倒是遇到過不少四位數(shù)驗證碼爆破的,但是這種可以結(jié)合短信遍歷,一個短信驗證碼只能驗證三次的,最后能成功利用的還是第一次遇到,關(guān)鍵還是這里不存在圖片驗證碼或者行為
    的頭像 發(fā)表于 09-07 09:14 ?4942次閱讀

    驗證碼到底在驗證啥?聊一聊驗證碼是怎么為難我們?nèi)祟惖?/a>

    在文章開頭,老狐先給大家玩一個驗證碼的游戲,猜出圖中驗證碼字母。
    的頭像 發(fā)表于 08-12 10:25 ?2017次閱讀
    <b class='flag-5'>驗證碼</b>到底在<b class='flag-5'>驗證</b>啥?聊一聊<b class='flag-5'>驗證碼</b>是怎么為難我們?nèi)祟惖? />    </a>
</div>                            <div   id=

    SpringBoot分布式驗證碼登錄方案

    傳統(tǒng)的項目大都是基于session交互的,前后端都在一個項目里面,比如傳統(tǒng)的SSH項目或者一些JSP系統(tǒng),當(dāng)前端頁面觸發(fā)到獲取驗證碼請求,可以將驗證碼里面的信息存在上下文中,所以登錄的時候只需要 用戶名、密碼、驗證碼即可。
    的頭像 發(fā)表于 10-12 17:34 ?675次閱讀
    SpringBoot分布式<b class='flag-5'>驗證碼</b>登錄方案