SpringBoot集成Google Kaptcha图形验证码

前言

相信大家在浏览网页的时候,经常会碰到人机校验。很经典的要属Google的人机校验,用多张图片进行点击校验。可以说是对于我们人类来说就是很烦的啦。烦归烦,但是为了安全着想,我们还是需要为自己的项目加上验证码机制,特别是一些防刷的接口调用下。今天我们就来学习简单的图形验证码实现。

实现

SpringBoot DEMO,Maven项目。
创建SpringBoot项目很简单,Intellij IDEA旗舰版可直接创建。

maven依赖

引入kaptcha maven依赖

<!-- https://mvnrepository.com/artifact/com.github.penggle/kaptcha -->
<dependency>
	<groupId>com.github.penggle</groupId>
	<artifactId>kaptcha</artifactId>
	<version>2.3.2</version>
</dependency>

配置文件

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
 **/
@Configuration
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

SpringBoot集成Google Kaptcha图形验证码

参考链接

1、Kaptcha 和 JCaptcha 使用介绍和实例
2、Google Code - Kaptcha

 

上一篇:VMWare安装centos7


下一篇:JAVA学习笔记(二十四)-常用API