本次分享使用
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);
}
}
本次分享還涉及兩個工具類,DateUtils
及RRException
,Result
三個輔助類,由於篇副有限就不在此展示,至此驗證碼生成主要邏輯已經實現,進行測試查看數據庫及返回值如下:
- 請求返回
- 查看數據庫
- 校驗返回