无意之中发现一个好玩的东西,那就是生成验证码图片,感觉还挺好玩的。意外看到 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
中,验证时,只需要对传递过来的验证码正文进行校验即可。