开发实战|第二篇:基于kaptcha实现验证码

本次分享使用captcha进行验证码生成,虽然本次分享为验证码生成,但仍然涉及到许多知识点,其中包括springboot项目搭建,引入MybatisPlus,lombok插件,时间计算插件joda-time

1.环境搭建

  • 创建SpringBoot项目,引入springBoot环境相关依赖

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.8.RELEASE</version>
    </parent>
    
  • 引入数据库依赖,连接池,lombok,joda-time,http等相关依赖

    <!--引入lombok依赖-->
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <version>1.18.10</version>
    </dependency>
    <dependency>
        <groupId>com.alibaba</groupId>
        <artifactId>druid-spring-boot-starter</artifactId>
        <version>1.1.20</version>
    </dependency>
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>8.0.16</version>
    </dependency>
    <dependency>
        <groupId>com.baomidou</groupId>
        <artifactId>mybatis-plus-boot-starter</artifactId>
        <version>3.2.0</version>
        <exclusions>
            <exclusion>
                <groupId>com.baomidou</groupId>
                <artifactId>mybatis-plus-generator</artifactId>
            </exclusion>
        </exclusions>
    </dependency>
    <dependency>
        <groupId>joda-time</groupId>
        <artifactId>joda-time</artifactId>
        <version>2.9.9</version>
    </dependency>
    <dependency>
        <groupId>com.qcloud</groupId>
        <artifactId>cos_api</artifactId>
        <version>4.4</version>
        <exclusions>
            <exclusion>
                <groupId>org.slf4j</groupId>
                <artifactId>slf4j-log4j12</artifactId>
            </exclusion>
        </exclusions>
    </dependency>
    <dependency>
        <groupId>commons-io</groupId>
        <artifactId>commons-io</artifactId>
        <version>2.6</version>
    </dependency>
    
  • 引入验证码所需依赖kaptcha

    <!--引入验证码依赖-->
    <dependency>
        <groupId>com.github.axet</groupId>
        <artifactId>kaptcha</artifactId>
        <version>0.0.9</version>
    </dependency>
    
  • 配置数据库连接

    server:
      port: 8082
    
    spring:
      datasource:
        type: com.alibaba.druid.pool.DruidDataSource
        driver-class-name: com.mysql.cj.jdbc.Driver
        druid:
          url: jdbc:mysql://192.168.1.100:3306/study
          username: root
          password: root
    

2.验证码实现

  • 验证码配置
@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", "5");
    properties.put("kaptcha.textproducer.font.names", "Arial,Courier,cmr10,宋体,楷体,微软雅黑");
    Config config = new Config(properties);
    DefaultKaptcha defaultKaptcha = new DefaultKaptcha();
    defaultKaptcha.setConfig(config);
    return defaultKaptcha;
  }
}
  • 验证码实体
@TableName("sys_captcha")
@Data
public class SyscaptchaEntity {

  @TableId(type = IdType.INPUT)
  private String uuid;
  /**
   * 验证码
   */
  private String code;
  /**
   * 过期时间
   */
  private Date expireTime;

}
  • 验证码dao
@Mapper
public interface SyscaptchaDao extends BaseMapper<SyscaptchaEntity> {

}
  • 验证码实现主要逻辑
@Service
public class SyscaptchaServiceImpl extends ServiceImpl<SyscaptchaDao, SyscaptchaEntity> implements
    SyscaptchaService {

  @Resource
  private Producer producer;

  @Override
  public BufferedImage getCaptcha(String uuid) {
    if (StringUtils.isEmpty(uuid)) {
      throw new RRException("uuid不能为空");
    }
    //获取验证码
    String code = producer.createText();
    SyscaptchaEntity syscaptchaEntity = new SyscaptchaEntity();
    syscaptchaEntity.setUuid(uuid);
    syscaptchaEntity.setCode(code);
    //从现在开始五分钟后过期
    syscaptchaEntity.setExpireTime(DateUtils.addDateMinutes(new Date(), 5));
    this.saveOrUpdate(syscaptchaEntity);
    return producer.createImage(code);
  }

  @Override
  public boolean validate(String uuid, String code) {
    //根据uuid查询验证码
    SyscaptchaEntity syscaptchaEntity = this.getOne(new QueryWrapper<SyscaptchaEntity>().eq("uuid", uuid));
    //验证码不存在,校验不通过
    if(Objects.isNull(syscaptchaEntity)){
      return false;
    }
    //删除数据库验证码
    this.removeById(uuid);
    //验证码相同,且过期时间大于当前时间,则表示在有效期内
    if(syscaptchaEntity.getCode().equalsIgnoreCase(code) && syscaptchaEntity.getExpireTime().getTime()>= System.currentTimeMillis()){
      return true;
    }
    return false;
  }
}
  • 实现controller
@RestController
public class SyscaptchaController {

  @Resource
  private SyscaptchaService syscaptchaService;

  @GetMapping("/captcha")
  public void get(@RequestParam("uuid") String uuid, HttpServletResponse response) throws IOException {
    response.setHeader("Cache-Control", "no-store,no-cache");
    response.setContentType("image/jpeg");
    BufferedImage image = syscaptchaService.getCaptcha(uuid);
    ServletOutputStream outputStream = response.getOutputStream();
    ImageIO.write(image, "jpg", outputStream);
    IOUtils.closeQuietly(outputStream);
  }

  @GetMapping("/validate")
  public R validate(@RequestParam("uuid") String uuid, @RequestParam("code") String code) {
    boolean validate = syscaptchaService.validate(uuid, code);
    return R.ok().put("validate",validate);
  }

}

本次分享还涉及两个工具类,DateUtilsRRException,Result三个辅助类,由于篇副有限就不在此展示,至此验证码生成主要逻辑已经实现,进行测试查看数据库及返回值如下:

  • 请求返回

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NVmPsROd-1570505142373)(/home/zycao/.config/Typora/typora-user-images/1570504857768.png)]

  • 查看数据库

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-afvDCONx-1570505142374)(/home/zycao/.config/Typora/typora-user-images/1570504894897.png)]

  • 校验返回

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-TAKWf7XX-1570505142374)(/home/zycao/.config/Typora/typora-user-images/1570504929483.png)]

概要介绍:本门课程属于“Java分布式中间件大汇聚实战”系列课程,主要介绍了企业级项目中真实的应用场景的实现及主流的Java核心技术栈(Redis、RabbitMQ、Spring AOP、Redisson、ZooKeeper…)的实战等等。除此之外,还介绍了如何基于Redis设计并实战一款点赞系统(点赞、取消点赞、排行榜、用户中心、文章点赞用户列表…)可以说技术干货甚多,不仅可以巩固企业级应用系统的开发实战能力,相信在面试、跳槽涨薪方面也能带来相应的帮助!课程内容:传说中的金三银四、面试跳槽涨薪季已经来临,Debug特地为大家准备了一系列跟面试、跳槽、巩固核心技术栈相关的课程,本门课程属于第一季,其中的内容包括企业级项目中真实的应用场景实战、面试相关的技术点分享、主流的Java技术栈(Undertow、Redis、RabbitMQ、Spring AOP、Redisson、ZooKeeper…)实战等等。除此之外,我们还基于Redis设计并实战了一款点赞系统,可以说技术干货甚多。在课程的最后,Debug给大家整理了一份最新的面向BAT大厂招聘 ~ 2020年程序猿最新的Java面试题(附带目录和答案),希望对各位小伙伴的成长有所帮助!值得一提的是,本季课程实战的应用场景包括“日志记录”、“邮件发送”、“通告消息通知”、“短信验证码失效验证”、“会员到期自动提醒/到期前N天自动提醒”以及“点赞系统”的设计与实战,其大纲如下所示:其中,涉及到的技术栈包括Spring Boot2.0、Mybatis、Undertow、Redis、RabbitMQ、Redisson、Spring AOP、 Java8…下面罗列出本门课程重点介绍的价格应用案例以及业务场景的实现流程图!(1)基于Spring的消息驱动模型实现日志的异步记录:(2)基于消息中间件RabbitMQ的消息队列实现日志的异步记录:(3)基于缓存中间件Redis的订阅发布机制实现商户公告消息通知:(4)基于Redis的Key失效与定时任务实现实现短信验证码的过期失效验证:其他核心、典型的应用案例和业务场景的实战可以详细参考“课程目录”!除此之外,我们还基于缓存中间件Redis设计并实战实现了点赞系统中的点赞功能模块,下面罗列出其中涉及到的相关功能模块的实战流程图:其课程收益如下所示:
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值