图像验证码

2021-08-09 17:36:24 浏览数 (1)

无意之中发现一个好玩的东西,那就是生成验证码图片,感觉还挺好玩的。意外看到 kaptcha

项目是 github 开源的,具体的项目源码细节自行参考 来看一下这个神奇的东西吧

依赖

代码语言:javascript复制
<dependency>
  <groupId>com.github.penggle</groupId>
  <artifactId>kaptcha</artifactId>
  <version>2.3.2</version>
</dependency>

只需要这个一个依赖即可

在生成之前,只需要配置一个图片生成器就可以了Producer,别人自己叫负责创建带有在其上绘制的文本的验证码图像。搞那么复杂干嘛是不是,直接操作他就完了,费了个劲的。

这个里面只有两个方法,首先是 创建将写入扭曲文本的图像。 createImage(String text)

还有一个就是要绘制的文本 createText()

创建kaptcha实例

代码语言:javascript复制
/**
 * 配置 kaptcha 实例
 *
 * @return 图形创建者
 */
@Bean
public Producer captcha() {
    // 配置 图形眼正码的基本参数
    Properties properties = new Properties();
    // 图片的宽度
    properties.setProperty("kaptcha.image.width", "150");
    // 图片的长度
    properties.setProperty("kaptcha.image.height", "50");
    // 字符集
    properties.setProperty("kaptcha.textproducer.char.String", "0123456789");
    // 字符长度
    properties.setProperty("kaptcha.textproducer.char.length", "4");
    Config config = new Config(properties);
    // 使用默认的图形眼正码实现 可自定义实现
    DefaultKaptcha defaultKaptcha = new DefaultKaptcha();
    defaultKaptcha.setConfig(config);
    return defaultKaptcha;
}

生成图片

代码语言:javascript复制
@Autowired
private Producer producer;

/**
  * 生成图片
  *
  * @param request
  * @param response
  */
@GetMapping("captcha.jpg")
public void getCaptcha(HttpServletRequest request, HttpServletResponse response) {
    // 设置内容类型
    response.setContentType("image/jpeg");
    // 创建验正码文本
    String capText = producer.createText();
    // 将验正码文本设置到 session 中
    request.getSession().setAttribute("captcha", capText);
    // 创建验证码图片
    BufferedImage bufferedImage = producer.createImage(capText);
    // 获取响应的输出流
    try {
        @Cleanup ServletOutputStream outputStream = response.getOutputStream();
        // 将图片验证码数据写到响应的输出流
        ImageIO.write(bufferedImage, "jpg", outputStream);
    } catch (IOException e) {
        e.printStackTrace();
    }
}

一般像Huttol也有相应的工具类,例如Hutool自定义验证码

上面的是一种,但是偶然发现 GitHub 提示可能会有安全隐患之类的,那我们看一下 Hutool是如何实现的,换汤不换药,只需要修改请求的接口即可,这里就只单纯的演示一下线段干扰的验证码

生成图片

代码语言:javascript复制
/**
 * 生成图片
 *
 * @param request
 * @param response
 */
@GetMapping("captcha.jpg")
public void getCaptcha(HttpServletRequest request, HttpServletResponse response) {
        // 设置内容类型
        response.setContentType("image/jpeg");
        //定义图形验证码的长和宽
        LineCaptcha lineCaptcha = CaptchaUtil.createLineCaptcha(200, 100);
        // 将验正码文本设置到 session 中
        request.getSession().setAttribute("captcha", lineCaptcha.getCode());
        BufferedImage image = lineCaptcha.getImage();
        try {
            @Cleanup ServletOutputStream outputStream = response.getOutputStream();
            // 将图片验证码数据写到响应的输出流
            ImageIO.write(image, "jpg", outputStream);
        } catch (IOException e) {
            e.printStackTrace();
        }
}

对于这种图形验证码,各自有各自的看法吧,闲着也是闲着,为后面的图形验证做一下准备,验证码已存在于session中,验证时,只需要对传递过来的验证码正文进行校验即可。

0 人点赞