springboot集成kaptcha验证码

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/QiaoRui_/article/details/81092343

我们的项目中经常用到验证码来防止机器无成本获取数据或破坏,网上有很多验证码,我们要用的是谷歌的开源验证码kaptcha,先看下效果

 一、pom.xml中配置依赖

<dependency>
    <groupId>com.github.axet</groupId>
    <artifactId>kaptcha</artifactId>
    <version>0.0.9</version>
</dependency>

 这是现在可以访问的地址,官方地址已经不能访问如下

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

二、配置kaptcha配置类(springboot项目)

package com.rails.travel.conf;

import java.util.Properties;

import org.springframework.context.annotation.Bean;
import org.springframework.stereotype.Component;

import com.google.code.kaptcha.impl.DefaultKaptcha;
import com.google.code.kaptcha.util.Config;

@Component
public class KaptchaConfig {
	@Bean
	public DefaultKaptcha getDefaultKaptcha(){
		DefaultKaptcha defaultKaptcha = new DefaultKaptcha();
		Properties properties = new Properties();
		properties.setProperty("kaptcha.border", "yes");
		properties.setProperty("kaptcha.border.color", "blue");
		properties.setProperty("kaptcha.textproducer.font.color", "blue");
		properties.setProperty("kaptcha.image.width", "110");
		properties.setProperty("kaptcha.image.height", "35");
		properties.setProperty("kaptcha.textproducer.font.size", "30");
		properties.setProperty("kaptcha.session.key", "code");
		properties.setProperty("kaptcha.noise.color", "blue");
		properties.setProperty("kaptcha.obscurificator.impl", "com.google.code.kaptcha.impl.ShadowGimpy");
		properties.setProperty("kaptcha.textproducer.char.length", "4");
		properties.setProperty("kaptcha.textproducer.font.names", "宋体,楷体,微软雅黑");
		Config config = new Config(properties);
		defaultKaptcha.setConfig(config);
		
		return defaultKaptcha;
	}
}

三、请求验证码接口(验证码图片)

@Autowired
DefaultKaptcha defaultKaptcha;


@RequestMapping(value="/defaultKaptcha", method=RequestMethod.GET)
public void defaultKaptcha(HttpServletRequest httpServletRequest,HttpServletResponse httpServletResponse,
			@RequestParam(name = "coldFlag")String coldFlag) throws Exception{
	 	 byte[] captchaChallengeAsJpeg = null;  
         ByteArrayOutputStream jpegOutputStream = new ByteArrayOutputStream();  
         try {  
         //生产验证码字符串并保存到session中去
         String createText = defaultKaptcha.createText();
        //给定一个唯一标识,防止验证码重复使用
         httpServletRequest.getSession().setAttribute(coldFlag, createText);
         //redisCache.set(RedisCache.prefix, coldFlag, createText);
         //使用生产的验证码字符串返回一个BufferedImage对象并转为byte写入到byte数组中
         BufferedImage challenge = defaultKaptcha.createImage(createText);
         ImageIO.write(challenge, "jpg", jpegOutputStream);
         } catch (IllegalArgumentException e) {  
             httpServletResponse.sendError(HttpServletResponse.SC_NOT_FOUND);  
             return;  
         } 
   
         //定义response输出类型为image/jpeg类型,使用response输出流输出图片的byte数组
         captchaChallengeAsJpeg = jpegOutputStream.toByteArray();  
         httpServletResponse.setHeader("Cache-Control", "no-store");  
         httpServletResponse.setHeader("Pragma", "no-cache");  
         httpServletResponse.setDateHeader("Expires", 0);  
         httpServletResponse.setContentType("image/jpeg");  
         ServletOutputStream responseOutputStream =  
                 httpServletResponse.getOutputStream();  
         responseOutputStream.write(captchaChallengeAsJpeg);  
         responseOutputStream.flush();  
         responseOutputStream.close();  
	}

四、前端调用验证码图片

在img标签内src属性写上自己请求验证码路劲,就是上个接口路劲即可

五、验证

前端传过来的验证码和放在session中的验证码判断即可(最好session的key是唯一标识当前毫秒值这样可以预防验证码重复使用和跨机器使用),如果是分布式最好放在Redis或者是所有机器共享的地方

六、kaptcha详细配置表

Constant 描述 默认值
kaptcha.border 图片边框,合法值:yes , no yes
kaptcha.border.color 边框颜色,合法值: r,g,b (and optional alpha) 或者 white,black,blue. black
kaptcha.border.thickness 边框厚度,合法值:>0 1
kaptcha.image.width 图片宽 200
kaptcha.image.height 图片高 50
kaptcha.producer.impl 图片实现类 com.google.code.kaptcha.impl.DefaultKaptcha
kaptcha.textproducer.impl 文本实现类 com.google.code.kaptcha.text.impl.DefaultTextCreator
kaptcha.textproducer.char.string 文本集合,验证码值从此集合中获取 abcde2345678gfynmnpwx
kaptcha.textproducer.char.length 验证码长度 5
kaptcha.textproducer.font.names 字体 Arial, Courier
kaptcha.textproducer.font.size 字体大小 40px.
kaptcha.textproducer.font.color 字体颜色,合法值: r,g,b  或者 white,black,blue. black
kaptcha.textproducer.char.space 文字间隔 2
kaptcha.noise.impl 干扰实现类 com.google.code.kaptcha.impl.DefaultNoise
kaptcha.noise.color 干扰 颜色,合法值: r,g,b 或者 white,black,blue. black
kaptcha.obscurificator.impl 图片样式: 
水纹com.google.code.kaptcha.impl.WaterRipple 
鱼眼com.google.code.kaptcha.impl.FishEyeGimpy
阴影com.google.code.kaptcha.impl.ShadowGimpy
com.google.code.kaptcha.impl.WaterRipple
kaptcha.background.impl 背景实现类 com.google.code.kaptcha.impl.DefaultBackground
kaptcha.background.clear.from 背景颜色渐变,开始颜色 light grey
kaptcha.background.clear.to 背景颜色渐变, 结束颜色 white
kaptcha.word.impl 文字渲染器 com.google.code.kaptcha.text.impl.DefaultWordRenderer
kaptcha.session.key session key KAPTCHA_SESSION_KEY
kaptcha.session.date session date KAPTCHA_SESSION_DATE

猜你喜欢

转载自blog.csdn.net/QiaoRui_/article/details/81092343