前后端分离使用SpringBoot集成Kaptcha实现验证码功能

验证码(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/可以用这个网站在线验证

验证结果如下

 

  • 3
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值