Springboot 使用 Kaptcha 实现验证码生成

概述

在一般的需求场景中,验证码作为一个识别 人类 or 机器人 的工具,几乎无处不在。So, 本文讲述在 springboot 之中生成验证码。而本次所使用的的 Kaptcha 可以实现很多种验证码。

使用 Kaptcha

pom

   <dependency>
        <groupId>com.github.penggle</groupId>
        <artifactId>kaptcha</artifactId>
        <version>2.3.2</version>
    </dependency>

配置类

一般的,我们需要去配置验证码具体的样子,如:边框、文字大小、文字颜色等,而本文只实现了简单的字母验证码(创建名字为 captchaProducer 的 bean)。

@Configuration
public class CaptchaConfig {

    @Bean(name = "captchaProducer")
    public DefaultKaptcha getKaptcheCode() {
        DefaultKaptcha defaultKaptcha = new DefaultKaptcha();
        Properties properties = new Properties();
        properties.setProperty("kaptcha.border", "no");
        properties.setProperty("kaptcha.textproducer.font.color", "black");
        properties.setProperty("kaptcha.image.width", "100");
        properties.setProperty("kaptcha.image.height", "36");
        properties.setProperty("kaptcha.textproducer.font.size", "30");
        properties.setProperty("kaptcha.obscurificator.impl", "com.google.code.kaptcha.impl.ShadowGimpy");
        properties.setProperty("kaptcha.session.key", "code");
        properties.setProperty("kaptcha.noise.impl", "com.google.code.kaptcha.impl.NoNoise");
        properties.setProperty("kaptcha.background.clear.from", "232,240,254");
        properties.setProperty("kaptcha.background.clear.to", "232,240,254");
        properties.setProperty("kaptcha.textproducer.char.length", "4");
        properties.setProperty("kaptcha.textproducer.font.names", "彩云,宋体,楷体,微软雅黑");
        Config config = new Config(properties);
        defaultKaptcha.setConfig(config);
        return defaultKaptcha;
    }

}

应用

首先我们需要引入刚才我们创建的 bean,其次编写接口。从代码中可以看出,我们需要先在响应头中设置相对应的数据,这样告诉浏览器此次返回数据是图片数据(ContentType),其次是本次接口无需缓存。

之后使用 producer.createText 方法生成文本数据、再由 producer.createImage(capText) 方法生成图片数据,然后使用 ImageIO.write 的工具类将它写入此次响应流之中。

    @Resource(name = "captchaProducer")
    private Producer producer;

    @GetMapping("/verification/code")
    public void getKaptchaImage(HttpServletRequest request, HttpServletResponse response) throws Exception {
        response.setDateHeader("Expires", 0);
        response.setHeader("Cache-Control", "no-store, no-cache, must-revalidate");
        response.addHeader("Cache-Control", "post-check=0, pre-check=0");
        response.setHeader("Pragma", "no-cache");
        response.setContentType("image/jpeg");
        String capText = producer.createText();
        //一般的,将 sessionId 或其他代表用户身份的信息 && 验证码文本存入 Redis 即可。
        System.out.println(String.format("%s - %s", request.getSession().getId(), capText));
        request.getSession().setAttribute(Constants.KAPTCHA_SESSION_KEY, capText);

        BufferedImage bi = producer.createImage(capText);
        ServletOutputStream out = response.getOutputStream();

        //将 producer 生成的图片数据传给 response 的输出流,从而在页面中显示。
        ImageIO.write(bi, "jpg", out);

        out.flush();
        out.close();
    }
最后修改:2021 年 10 月 14 日 05 : 31 PM
如果觉得我的文章对你有用,请随意赞赏