相信大家在浏览网页的时候,经常会碰到人机校验。很经典的要属Google的人机校验,用多张图片进行点击校验。可以说是对于我们人类来说就是很烦的啦。烦归烦,但是为了安全着想,我们还是需要为自己的项目加上验证码机制,特别是一些防刷的接口调用下。今天我们就来学习简单的图形验证码实现。
SpringBoot DEMO,Maven项目。
创建SpringBoot项目很简单,Intellij IDEA旗舰版可直接创建。
引入kaptcha maven依赖
com.github.penggle
kaptcha
2.3.2
application.yml
kaptcha:
border: "yes" // 是否有边框,默认为yes,可选yes、no
border.color: 105,179,90 //边框颜色
textproducer:
font:
color: blue // 验证码字体颜色
size: 30 // 文本字符大小
names: 宋体,楷体,微软雅黑 //文本字体样式
char:
length: 4 //验证码文本字符长度
image:
width: 120 // 图片宽度
height: 40 // 图片高度
session:
key: code // 存储session key
KaptchaConfig.java
/**
* @Description Kaptcha配置类 用于生成图形验证码
* @Author chenlinghong
* @Date 2019/1/25 10:31
**/
@Component
public class KaptchaConfig {
@Value("${kaptcha.border}")
private String border;
@Value("${kaptcha.border.color}")
private String borderColor;
@Value("${kaptcha.textproducer.font.color}")
private String textproducerFontColor;
@Value("${kaptcha.textproducer.font.size}")
private String textproducerFontSize;
@Value("${kaptcha.textproducer.font.names}")
private String textproducerFontNames;
@Value("${kaptcha.textproducer.char.length}")
private String textproducerCharLength;
@Value("${kaptcha.image.width}")
private String imageWidth;
@Value("${kaptcha.image.height}")
private String imageHeight;
@Value("${kaptcha.session.key}")
private String sessionKey;
@Bean
public DefaultKaptcha getDefaultKapcha(){
DefaultKaptcha defaultKaptcha = new DefaultKaptcha();
Properties properties = new Properties();
properties.setProperty("kaptcha.border", border);
properties.setProperty("kaptcha.border.color", borderColor);
properties.setProperty("kaptcha.textproducer.font.color", textproducerFontColor);
properties.setProperty("kaptcha.textproducer.font.size", textproducerFontSize);
properties.setProperty("kaptcha.textproducer.font.names", textproducerFontNames);
properties.setProperty("kaptcha.textproducer.char.length", textproducerCharLength);
properties.setProperty("kaptcha.image.width", imageWidth);
properties.setProperty("kaptcha.image.height", imageHeight);
properties.setProperty("kaptcha.session.key", sessionKey);
Config config = new Config(properties);
defaultKaptcha.setConfig(config);
return defaultKaptcha;
}
}
从application.yml中获取到配置属性,通过@Bean注入返回值为DefaultKaptcha的方法,方法体内获取到相应的properties进行配置DefaultKaptcha。即可在其他类中进行注入此类,使用。
ImageController.java
@CrossOrigin
@Slf4j
@RestController
@RequestMapping(value = "/img")
public class ImageController {
/* 注入Kaptcha */
@Autowired
private DefaultKaptcha defaultKaptcha;
@GetMapping(value = "/code")
public Result defaultKaptcha(HttpServletRequest request, HttpServletResponse response){
byte[] captchaChallengeAsJpeg;
ByteArrayOutputStream jpegOutputStream = new ByteArrayOutputStream();
/**
* 生成验证码字符串并保存到session中
*/
String createText = defaultKaptcha.createText();
HttpSession session = request.getSession();
session.setAttribute(SessionConstant.IMAGE_CODE, createText);
/**
* 使用生成的验证码字符串返回一个BufferedImage对象并转为byte写入到byte数组中
*/
BufferedImage challenge = defaultKaptcha.createImage(createText);
try {
ImageIO.write(challenge,"jpg",jpegOutputStream);
} catch (IOException e) {
log.error("生成图形验证码失败",e);
throw new BusinessException(ErrorEnum.CRATE_IMAGE_ERROR); // 抛出异常,可以不用关心
}
/**
* 定义response输出类型为image/jpeg类型,使用response输出流输出图片的byte数组
*/
captchaChallengeAsJpeg = jpegOutputStream.toByteArray();
response.setHeader("Cache-Control", "no-store");
response.setHeader("Pragma", "no-cache");
response.setDateHeader("Expires",0);
response.setContentType("image/jpeg");
try {
ServletOutputStream servletOutputStream = response.getOutputStream();
servletOutputStream.write(captchaChallengeAsJpeg);
servletOutputStream.flush();
servletOutputStream.close();
} catch (IOException e) {
log.error("输出验证码失败",e);
throw new BusinessException(ErrorEnum.CRATE_IMAGE_ERROR); // 抛出异常,可以不用关心
}
return ResultUtil.success(); // 返回成功提示信息
}
}
通过文件流的方式,直接输出验证码图片。
启动项目,浏览器访问 http://127.0.0.1:8080/img/code
1、Kaptcha 和 JCaptcha 使用介绍和实例
2、Google Code - Kaptcha