验证码(CAPTCHA)是“Completely Automated Public Turing test to tell Computers and Humans Apart”(全自动区分计算机和人类的图灵测试)的缩写,是一种区分用户是计算机还是人的公共全自动程序。可以防止:恶意破解密码、刷票、论坛灌水,有效防止某个黑客对某一个特定注册用户用特定程序暴力破解方式进行不断的登陆尝试,实际上用验证码是现在很多网站通行的方式,我们利用比较简易的方式实现了这个功能。这个问题可以由计算机生成并评判,但是必须只有人类才能解答。由于计算机无法解答CAPTCHA的问题,所以回答出问题的用户就可以被认为是人类。
在我们的网站中验证码是常用的手段之一今天给大家介绍一下kaptcha的和springboot一起使用的简单例子。
Kaptcha是谷歌开源的一个验证码jar包,我们可以简单配置属性实现验证码的验证功能。
添加maven依赖
<!-- google kaptcha验证码 -->
<dependency>
<groupId>com.github.penggle</groupId>
<artifactId>kaptcha</artifactId>
<version>2.3.2</version>
<exclusions>
<exclusion>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
</exclusion>
</exclusions>
</dependency>
核心代码
1、配置类
@Configuration
public class KaptchaConfig {
@Bean
public DefaultKaptcha producer() {
Properties properties = new Properties();
properties.put("kaptcha.border", "no");
properties.put("kaptcha.textproducer.font.color", "black");
properties.put("kaptcha.textproducer.char.space", "10");
properties.put("kaptcha.textproducer.char.length","4");
properties.put("kaptcha.image.height","34");
properties.put("kaptcha.textproducer.font.size","25");
properties.put("kaptcha.noise.impl","com.google.code.kaptcha.impl.NoNoise");
Config config = new Config(properties);
DefaultKaptcha defaultKaptcha = new DefaultKaptcha();
defaultKaptcha.setConfig(config);
return defaultKaptcha;
}
}
2、怎么生成验证码
1、生成随机字母数字(验证码信息)2、生成随机数token。
2、返回BASE64Encoder 后的验证码信息、随机token给用户。
3、同时redis中保存以token为key验证码信息为vaule,方便验证。
@Autowired
DefaultKaptcha producer; //记得注入这个
@Override
public Map<String, Object> generateVerificationCode() throws Exception {
Map<String, Object> map = new HashMap<>();
// 生成文字验证码
String text = producer.createText();
// 生成图片验证码
ByteArrayOutputStream outputStream = null;
BufferedImage image = producer.createImage(text);
outputStream = new ByteArrayOutputStream();
ImageIO.write(image, "jpg", outputStream);
//
map.put("img", Base64.getEncoder().encodeToString(outputStream.toByteArray()));
//生成验证码对应的token 以token为key 验证码为value存在redis中
String codeToken = UUID.randomUUID().toString();
redisTemplate.opsForValue().set(codeToken, text, Constant.VERIFICATION__CODE_TIME, TimeUnit.MINUTES);
map.put("cToken", codeToken);
return map;
}
3、怎么验证
@Override
public boolean checkCodeToken(String sToken, String textStr) {
Object value = redisTemplate.opsForValue().get(sToken);
if (value != null && textStr.equals(value)) {
return true;
} else {
return false;
}
}
//控制层
String sToken = (String) params.get("sToken");
String textStr = (String) params.get("textStr");
boolean flag = userService.checkCodeToken(sToken , textStr );
if(!flag) {
result.put("code", CodeAndMsgEnum.ERROR.getcode());
result.put("msg", "验证码错误、或已失效!");
return result;
}
请求接口后返回的数据后查看验证码
http://imgbase64.duoshitong.com/可以用这个网站在线验证
验证结果如下