SpringBoot整合Kaptcha验证码
Kaptcha 简介
Kaptcha 是一个可高度配置的实用验证码生成工具,可自由配置的选项如:
- 验证码的字体
- 验证码字体的大小
- 验证码字体的字体颜色
- 验证码内容的范围(数字,字母,中文汉字!)
- 验证码图片的大小,边框,边框粗细,边框颜色
- 验证码的干扰线
- 验证码的样式(鱼眼样式、3D、普通模糊、...)
Kaptcha 详细配置表
Constant | 描述 | 默认值 |
---|---|---|
kaptcha.border | 图片边框,合法值:yes , no | yes |
kaptcha.border.color | 边框颜色,合法值: r,g,b (and optional alpha) 或者 white,black,blue. | black |
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 | 图片样式:<br />水纹 com.google.code.kaptcha.impl.WaterRipple <br /> 鱼眼 com.google.code.kaptcha.impl.FishEyeGimpy <br /> 阴影 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 |
pom
<!--验证码--> <dependency> <groupId>com.github.axet</groupId> <artifactId>kaptcha</artifactId> <version>0.0.9</version> </dependency>
Configuration
package com.wildcatcloud.wildcat.gateway.config; import com.google.code.kaptcha.impl.DefaultKaptcha; import com.google.code.kaptcha.util.Config; import com.pig4cloud.pigx.common.core.constant.SecurityConstants; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import java.util.Properties; /** * @author qinbs * @date 2019-02-21 21:12:18 */ @Configuration public class KaptchaConfiguration { private static final String KAPTCHA_BORDER = "kaptcha.border"; private static final String KAPTCHA_TEXTPRODUCER_FONT_COLOR = "kaptcha.textproducer.font.color"; private static final String KAPTCHA_TEXTPRODUCER_CHAR_SPACE = "kaptcha.textproducer.char.space"; private static final String KAPTCHA_IMAGE_WIDTH = "kaptcha.image.width"; private static final String KAPTCHA_IMAGE_HEIGHT = "kaptcha.image.height"; private static final String KAPTCHA_TEXTPRODUCER_CHAR_LENGTH = "kaptcha.textproducer.char.length"; private static final Object KAPTCHA_IMAGE_FONT_SIZE = "kaptcha.textproducer.font.size"; /** * 默认生成图形验证码宽度 */ private static final String DEFAULT_IMAGE_WIDTH = "100"; /** * 默认生成图像验证码高度 */ private static final String DEFAULT_IMAGE_HEIGHT = "40"; /** * 边框颜色,合法值: r,g,b (and optional alpha) 或者 white,black,blue. */ private static final String DEFAULT_COLOR_FONT = "black"; /** * 图片边框 */ private static final String DEFAULT_IMAGE_BORDER = "no"; /** * 默认图片间隔 */ private static final String DEFAULT_CHAR_SPACE = "5"; /** * 验证码文字大小 */ private static final String DEFAULT_IMAGE_FONT_SIZE = "30"; @Bean public DefaultKaptcha producer() { Properties properties = new Properties(); properties.put(KAPTCHA_BORDER, DEFAULT_IMAGE_BORDER); properties.put(KAPTCHA_TEXTPRODUCER_FONT_COLOR, DEFAULT_COLOR_FONT); properties.put(KAPTCHA_TEXTPRODUCER_CHAR_SPACE, DEFAULT_CHAR_SPACE); properties.put(KAPTCHA_IMAGE_WIDTH, DEFAULT_IMAGE_WIDTH); properties.put(KAPTCHA_IMAGE_HEIGHT, DEFAULT_IMAGE_HEIGHT); properties.put(KAPTCHA_IMAGE_FONT_SIZE, DEFAULT_IMAGE_FONT_SIZE); properties.put(KAPTCHA_TEXTPRODUCER_CHAR_LENGTH, SecurityConstants.CODE_SIZE); Config config = new Config(properties); DefaultKaptcha defaultKaptcha = new DefaultKaptcha(); defaultKaptcha.setConfig(config); return defaultKaptcha; } }
生成验证码
//生成验证码 String text = producer.createText(); BufferedImage image = producer.createImage(text); //保存验证码信息 前台传随机数,也之后也用户比对 String randomStr = serverRequest.queryParam("randomStr").get(); redisTemplate.opsForValue().set(CommonConstants.DEFAULT_CODE_KEY + randomStr, text , SecurityConstants.CODE_TIME, TimeUnit.SECONDS); // 转换流信息写出 FastByteArrayOutputStream os = new FastByteArrayOutputStream(); try { ImageIO.write(image, "jpeg", os); } catch (IOException e) { log.error("ImageIO write err", e); return Mono.error(e); } return ServerResponse .status(HttpStatus.OK) .contentType(MediaType.IMAGE_JPEG) .body(BodyInserters.fromResource(new ByteArrayResource(os.toByteArray())));