概述
在一般的需求场景中,验证码作为一个识别 人类 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();
}
本页的评论功能已关闭