1、导入相关依赖前端实现验证码仅是单纯的一个小验证,若是想要实实在在的人机验证,还是需要由后端实现验证码的生成的。
2、编写配置类com.github.penggle kaptcha javax.servlet-api javax.servlet
import static com.google.code.kaptcha.Constants.*; // 导入相关常量
@Configuration
public class CaptchaProducerConfig {
@Bean(name = "captchaProducer")
public DefaultKaptcha getKaptchaBean(){
DefaultKaptcha defaultKaptcha = new DefaultKaptcha();
Properties properties = new Properties();
// 是否设置边框 默认为true 可以自己设置 yes no
properties.setProperty(KAPTCHA_BORDER,"yes");
// 边框颜色 默认为 black
properties.setProperty(KAPTCHA_BORDER_COLOR,"105,179,90");
// 图片高度 默认为50
properties.setProperty(KAPTCHA_IMAGE_HEIGHT,"60");
// 图片宽度 默认为200
properties.setProperty(KAPTCHA_IMAGE_WIDTH,"160");
// 文本字符大小 默认为 40
properties.setProperty(KAPTCHA_TEXTPRODUCER_FONT_SIZE,"35");
// 文本字符颜色 默认为 black
properties.setProperty(KAPTCHA_TEXTPRODUCER_FONT_COLOR,"blue");
// 验证码文本字符间距 默认为2
properties.setProperty(KAPTCHA_TEXTPRODUCER_CHAR_SPACE, "4");
// 验证码文本字符长度 默认为5
properties.setProperty(KAPTCHA_TEXTPRODUCER_CHAR_LENGTH, "6");
// 验证码文本字体样式 默认为new Font("Arial", 1, fontSize), new Font("Courier", 1, fontSize)
properties.setProperty(KAPTCHA_TEXTPRODUCER_FONT_NAMES, "Arial,Courier");
// 验证码噪点颜色 默认为Color.BLACK
properties.setProperty(KAPTCHA_NOISE_COLOR, "white");
// KAPTCHA_SESSION_KEY
properties.setProperty(KAPTCHA_SESSION_CONFIG_KEY, "kaptchaCodeMath");
// 验证码文本生成器 可以自定义文本生成器(com.xxx.KaptchaTextCreator) 可以使用默认
properties.setProperty(KAPTCHA_TEXTPRODUCER_IMPL, "com.xxx.KaptchaTextCreator");
// 干扰实现类
properties.setProperty(KAPTCHA_NOISE_IMPL, "com.google.code.kaptcha.impl.NoNoise");
// 图片样式 水纹com.google.code.kaptcha.impl.WaterRipple 鱼眼com.google.code.kaptcha.impl.FishEyeGimpy 阴影com.google.code.kaptcha.impl.ShadowGimpy
properties.setProperty(KAPTCHA_OBSCURIFICATOR_IMPL, "com.google.code.kaptcha.impl.ShadowGimpy");
Config config = new Config(properties);
defaultKaptcha.setConfig(config);
return defaultKaptcha;
}
}
自定义文本生成器继承 DefaultTextCreator 类 重写getText() 方法
public class KaptchaTextCreator extends DefaultTextCreator
{
@Override
public String getText()
{
// 按照自己的想法 生成自定义文本
return xxxx;
}
}
3、生成验证码
@GetMapping("/captchaImage")
public AjaxResult getCodeImage(){
AjaxResult ajaxResult = AjaxResult.success();
String text = captchaProducer.createText();
BufferedImage image = captchaProducer.createImage(text);
// 缓存用于登录校验
String key = UUID.randomUUID().toString();
redisCache.setCacheObject("captcha"+key,code,2, TimeUnit.MINUTES);
// 转换为字节流输出
FastByteArrayOutputStream outputStream = new FastByteArrayOutputStream();
try {
ImageIO.write(image,"jpg",outputStream);
} catch (IOException e) {
e.printStackTrace();
return AjaxResult.error(e.getMessage());
}
// 图片进行加密传输
ajaxResult.put("uuid",key);
ajaxResult.put("img", new base64Encoder().encode(outputStream.toByteArray()));
return ajaxResult;
}
4、前端验证码展示
this.imageUrl = "data:image/gif;base64," + res.img;5、登录验证
从缓存里取出验证码标识校验其正确性
String captcha = redisCache.getCacheObject(key);
if (captcha == null){
//验证逻辑自由发挥
}
基本上就这样。。。。。。没了



