開發實戰|第二篇:基於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)]

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章