上代码
<!--图片验证码-->
<dependency>
<groupId>com.github.penggle</groupId>
<artifactId>kaptcha</artifactId>
<version>2.3.2</version>
</dependency>
验证码配置类
/**
* 验证码配置类
*
* @author zhanghao
* @date 2019/7/16 14:40
*/
@Configuration
public class KaptchaController {
@Bean(name="captchaProducer")
public DefaultKaptcha getKaptchaBean(){
DefaultKaptcha defaultKaptcha=new DefaultKaptcha();
Properties properties=new Properties();
//验证码是否带边框 No
properties.setProperty("kaptcha.border", "no");
//验证码字体颜色
properties.setProperty("kaptcha.textproducer.font.color", "blue");
//验证码整体宽度
properties.setProperty("kaptcha.image.width", "400");
//验证码整体高度
properties.setProperty("kaptcha.image.height", "125");
//文字个数
properties.setProperty("kaptcha.textproducer.char.length", "4");
//文字大小
properties.setProperty("kaptcha.textproducer.font.size","120");
//文字随机字体
properties.setProperty("kaptcha.textproducer.font.names", "宋体,楷体,微软雅黑");
//文字距离
properties.setProperty("kaptcha.textproducer.char.space","16");
//干扰线颜色
properties.setProperty("kaptcha.noise.color","blue");
//自定义验证码样式
properties.setProperty("kaptcha.obscurificator.impl","com.zhiyingwl.modules.imageCode.base.DisKaptchaCssImpl");
//自定义验证码背景
properties.setProperty("kaptcha.background.impl","com.zhiyingwl.modules.imageCode.base.NoKaptchaBackhround");
Config config=new Config(properties);
defaultKaptcha.setConfig(config);
return defaultKaptcha;
}
}
感觉背景不好看 想要干净一点的
/**
* 去除验证码背景实现类
*
* @author zhanghao
* @date 2019/7/16 15:52
*/
public class NoKaptchaBackhround extends Configurable implements BackgroundProducer {
public NoKaptchaBackhround(){
}
@Override
public BufferedImage addBackground(BufferedImage baseImage) {
int width = 400;
int height = 125;
BufferedImage imageWithBackground = new BufferedImage(width, height, 1);
Graphics2D graph = (Graphics2D)imageWithBackground.getGraphics();
graph.fill(new Rectangle2D.Double(0.0D, 0.0D, (double)width, (double)height));
graph.drawImage(baseImage, 0, 0, null);
return imageWithBackground;
}
}
官方提供的三种样式也去掉
/**
* 自定义样式实现类
*
* @author zhanghao
* @date 2019/7/16 16:41
*/
public class DisKaptchaCssImpl extends Configurable implements GimpyEngine {
public DisKaptchaCssImpl(){
}
@Override
public BufferedImage getDistortedImage(BufferedImage baseImage) {
NoiseProducer noiseProducer = this.getConfig().getNoiseImpl();
BufferedImage distortedImage = new BufferedImage(400, 125, 2);
Graphics2D graph = (Graphics2D)distortedImage.getGraphics();
Random rand = new Random();
RippleFilter rippleFilter = new RippleFilter();
rippleFilter.setXAmplitude(7.6F);
rippleFilter.setYAmplitude(rand.nextFloat() + 1.0F);
rippleFilter.setEdgeAction(1);
BufferedImage effectImage = rippleFilter.filter(baseImage, (BufferedImage)null);
graph.drawImage(effectImage, 0, 0, (Color)null, (ImageObserver)null);
graph.dispose();
noiseProducer.makeNoise(distortedImage, 0.1F, 0.1F, 0.25F, 0.25F);
noiseProducer.makeNoise(distortedImage, 0.1F, 0.25F, 0.5F, 0.9F);
return distortedImage;
}
}
验证码生成和校验
/**
* 验证码控制层
*
* @author zhanghao
* @date 2019/7/16 17:35
*/
@RestController
@RequestMapping("/image_code")
public class ImageCodeController extends BaseController {
@Autowired
private Producer captchaProducer;
@Autowired
private RedisService redisService;
/**
* 生成验证码
*
* @param response
* @return void
* @author zhanghao
* @date 2019/7/17 2019/7/17
*/
@GetMapping("/pb/code")
public void getImageCode(HttpServletResponse response,@RequestParam("uuid") String uuid) throws Exception {
//禁止缓存
response.setDateHeader("Expires", 0);
response.setHeader("Cache-Control", "no-store, no-cache, must-revalidate");
response.addHeader("Cache-Control", "post-check=0, pre-check=0");
response.setHeader("Pragma", "no-cache");
//设置响应格式为png图片
response.setContentType("image/png");
//为验证码创建一个文本
String codeText = captchaProducer.createText();
//将验证码存到redis
redisService.set(ImageCodeKeyName.ZYWL_IMAGE_CODE+uuid,codeText);
// 用创建的验证码文本生成图片
BufferedImage bi = captchaProducer.createImage(codeText);
ServletOutputStream out = response.getOutputStream();
//写出图片
ImageIO.write(bi, "png", out);
try {
out.flush();
} finally {
out.close();
}
}
/**
* 图片验证码校验
*
* @param validImageCode
* @return com.zhiyingwl.base.entity.ResultEntity
* @author zhanghao
* @date 2019/7/17 2019/7/17
*/
@GetMapping("/pv/check")
public ResultEntity checkImageCode(
@RequestParam(value = "image_code") String validImageCode,
@RequestParam("uuid")String uuid){
try {
if (StrUtil.isBlank(validImageCode)){
return resultInfo(false,"验证码不能为空");
}
String imageCode = redisService.get(ImageCodeKeyName.ZYWL_IMAGE_CODE + uuid);
if (!imageCode.equals(validImageCode)){
return resultInfo(false,"验证码错误");
}
return resultInfo(true,"验证通过");
} catch (Exception e) {
return resultInfo(false,e.getMessage());
}
}
}
效果 官方的



自定义的

提醒:
-
前端调用生成验证码要在src里请求
-
使用seesion存储要解决跨域的问题
附上官方配置表
* 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