验证码案例

1. Kaptcha 插件介绍

Kaptcha 是Google的⼀个⾼度可配置的实⽤验证码⽣成⼯具。

1.1 原理

验证码可以客户端生成,也可以服务端生成。对于普通的字符验证码,后端通常分为两部分。
⼀是⽣成验证码内容,根据验证码内容和⼲扰项等,⽣成图⽚,返回给客户端。
⼆是把验证码内容存储起来,校验时取出来进⾏对⽐。
kaptcha插件选择把验证码存储在Session⾥。

1.2 引入依赖
<dependency>
  <groupId>com.oopsguy.kaptcha</groupId>
  <artifactId>kaptcha-spring-boot-starter</artifactId>
  <version>1.0.0-beta-2</version>
</dependency>
1.3 通过配置文件生成验证码生成器
kaptcha:
  text-producer:
    character:
      length: 4
    font:
      color: blue
  items:
    # admin captcha
    admin:
      path: /admin/captcha
      session:
        key: KAPTCHA_SESSION_KEY
        date: KAPTCHA_SESSION_DATE

配置说明:
image.png
配置后,可以直接访问http://XXX:port/admin/captcha即可生成验证码。
image.png

1.4 需求

image.png

  1. 页面生成验证码
  2. 输入验证码,点击提交,验证用户输入验证码是否正确,正确则进行页面跳转
1.4.1 约定前后交互接口

需求分析:
后端需要提供两个服务:

  1. 生成验证码,并返回验证码
  2. 校验验证码是否正确

接口定义:

  1. 生成验证码

请求:GET /admin/captcha
响应:图片内容
浏览器给服务器发送⼀个 GET /admin/captcha 这样的请求, 服务器返回⼀个图⽚, 浏览器显⽰在⻚⾯上。

  1. 校验验证码是否正确

请求:POST /admin/check?inputCaptcha=fgn3
响应:true
根据⽤⼾输⼊的验证码, 校验验证码是否正确. true: 验证成功. false: 验证失败

1.5 服务器端代码:

⽐对Session中存储的验证码是否和⽤⼾输⼊的⼀致,如果⼀致,并且时间在⼀分钟以为就认为成功

@RestController
@RequestMapping("/admin")
public class KaptchaController {
    private static final String KAPTCHA_SESSION_KEY = "KAPTCHA_SESSION_KEY";
    private static final String KAPTCHA_SESSION_DATE = "KAPTCHA_SESSION_DATE";
    private static final long CAPTCHA_TIME_OUT = 1000*60;//过期时间:一分钟,毫秒数
    /**
     *  校验验证码是否正确
     * @param inputCaptcha  用户输入的验证码
     * @return
     */

    @RequestMapping("/check")
    public boolean check(String inputCaptcha, HttpSession session){
        // 1.判断输入的验证码是否为空
        // 2.获取生成的验证码
        // 3.对比用户输入的验证码和生成的验证码是否一致
        // 4.确认验证码是否过期

        if(!StringUtils.hasLength(inputCaptcha)) {
            //验证码为空
            return false;
        }
        // 生成的验证码
        String saveCaptcha = (String) session.getAttribute(KAPTCHA_SESSION_KEY);
        // 验证码的生成时间
        Date saveCaptchaDate = (Date) session.getAttribute(KAPTCHA_SESSION_DATE);

        if(inputCaptcha.equalsIgnoreCase(saveCaptcha)) {
            // 确认验证码是否过期
            if(saveCaptchaDate != null &&
                    System.currentTimeMillis()-saveCaptchaDate.getTime() < CAPTCHA_TIME_OUT) {
                return true;
            }
        }
        return false;
    }
}

1.5 前端代码:
<!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="/admin/captcha" style="cursor: pointer;" title="看不清?换一张" />
    <input type="button" value="提交" id="checkCaptcha">
  </div>
  <script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.6.4/jquery.min.js"></script>
  <script>
    
    $("#verificationCodeImg").click(function(){
      $(this).hide().attr('src', '/admin/captcha?dt=' + new Date().getTime()).fadeIn();
    });

    $("#checkCaptcha").click(function () {
        $.ajax({
          type: "get",
          url: "/admin/check",
          data: {
            inputCaptcha: $("#inputCaptcha").val()
          },
          success: function(result) {
            if(result) {
              location.href = "success.html"
            } else {
              alert("验证码失败!");
            }
          }
        });
    });

  </script>
</body>

</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>
1.6 运行测试

通过url:http://127.0.0.1:8080/index.html访问服务
image.png
输入验证码,跳转页面
在这里插入图片描述

  • 21
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
你可以使用一些图像处理库和机器学习算法来识别爬虫中的图形验证码。以下是一个基本的案例示例: 1. 首先,你需要安装需要的库,如OpenCV和Pillow。使用以下命令进行安装: ``` pip install opencv-python pip install Pillow ``` 2. 导入所需的库: ```python import cv2 from PIL import Image from pytesseract import pytesseract ``` 3. 下载并保存验证码图片。 4. 使用OpenCV库加载验证码图片,并将其转换为灰度图像: ```python image = cv2.imread('captcha.png') gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) ``` 5. 对图像进行预处理,以便更好地识别验证码。可以尝试使用图像二值化、降噪等技术: ```python ret, thresh = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY_INV | cv2.THRESH_OTSU) ``` 6. 使用Pillow库创建一个临时图像对象,并将处理后的图像保存到临时文件中: ```python temp_image = Image.fromarray(thresh) temp_image.save('temp.png') ``` 7. 使用Tesseract库对临时文件中的验证码进行识别: ```python captcha_text = pytesseract.image_to_string(Image.open('temp.png')) ``` 8. 最后,可以输出识别出的验证码文本: ```python print('识别结果:', captcha_text) ``` 这只是一个基本的示例,实际的验证码可能会更复杂,需要根据具体情况进行适当的调整和优化。还可以尝试使用其他机器学习算法,如卷积神经网络(CNN),来提高验证码识别的准确性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值