1、添加依赖
2、添加配置
@Configuration
public class CaptchaConfig {
/**
* 验证码配置
* Kaptcha配置类名
*/
@Bean
@Qualifier("captchaProducer")
public DefaultKaptcha kaptcha() {
DefaultKaptcha kaptcha = new DefaultKaptcha();
Properties properties = new Properties();
// 验证码个数
properties.setProperty(Constants.KAPTCHA_TEXTPRODUCER_CHAR_LENGTH, "4");
// 字体间隔
properties.setProperty(Constants.KAPTCHA_TEXTPRODUCER_CHAR_SPACE, "8");
// 干扰实现类
properties.setProperty(Constants.KAPTCHA_NOISE_IMPL, "com.google.code.kaptcha.impl.NoNoise");
// 图片样式
properties.setProperty(Constants.KAPTCHA_OBSCURIFICATOR_IMPL, "com.google.code.kaptcha.impl.WaterRipple");
// 文字来源
properties.setProperty(Constants.KAPTCHA_TEXTPRODUCER_CHAR_STRING, "0123456789");
Config config = new Config(properties);
kaptcha.setConfig(config);
return kaptcha;
}
}
3、接口实现
@Api(tags = "图形验证码模块")
@RestController
@RequestMapping(("/api/validate/v1"))
@Slf4j
public class ValidateCodeController {
@Autowired
private StringRedisTemplate stringRedisTemplate;
@Autowired
private Producer captchaProducer;
/**
* 1分钟过期
*/
private static final long CAPTCHA_CODE_EXPIRED = 60 * 1000;
@ApiOperation("获取图形验证码")
@GetMapping("captcha")
public void getCaptcha(HttpServletRequest request, HttpServletResponse response) {
String cacheKey = getCaptchaKey(request);
String capText = captchaProducer.createText();
// 存储
stringRedisTemplate.opsForValue().set(cacheKey, capText, CAPTCHA_CODE_EXPIRED, TimeUnit.MILLISECONDS);
BufferedImage bi = captchaProducer.createImage(capText);
ServletOutputStream out;
try {
response.setDateHeader("Expires", 0);
response.setHeader("Cache-Control", "no-store, no-cache, must-revalidate");
response.addHeader("Cache-Control", "create_date-check=0, pre-check=0");
response.setHeader("Pragma", "no-cache");
out = response.getOutputStream();
ImageIO.write(bi, "jpg", out);
out.flush();
out.close();
} catch (IOException e) {
log.error("获取验证码失败:{}", e);
}
}
}