行为验证码 (behavior)
简介
continew-starter-captcha-behavior
是 ContiNew Starter 验证码模块针对行为验证码的默认实现,底层基于 AJ Captcha,提供滑动验证和点选验证两种方式。
主要特性
- 两种验证方式:支持滑动验证(滑动滑块至图片的具体位置)和点选验证(按照指定顺序点击图片中的文字)
- 灵活配置:支持配置缓存(已提供内存、Redisson,也可自定义)、底图路径、缓存类型、水印文字等
快速开始
引入依赖
xml
<dependency>
<groupId>top.continew.starter</groupId>
<artifactId>continew-starter-captcha-behavior</artifactId>
</dependency>
添加配置
配置详情请查看:top.continew.starter.captcha.behavior.autoconfigure.BehaviorCaptchaProperties
。
yaml
--- ### 验证码配置
continew-starter:
captcha:
## 行为验证码
behavior:
enabled: true
# 验证码类型
# 默认:BLOCKPUZZLE(滑动验证码)
# 如果值为为 DEFAULT,则 BLOCKPUZZLE(滑动验证码) CLICKWORD(点选验证码) 都会实例化
type: BLOCKPUZZLE
# 缓存类型 支持自定义(默认:LOCAL(程序内存))
# 对于分布式部署的应用,建议使用 REDIS
cache-type: REDIS
# 自定义缓存实现接口(注:当 cache-type 为 CUSTOM 时必填,且才会生效
# 具体实现可参考 top.charles7c.continew.starter.captcha.behavior.impl.BehaviorCaptchaCacheServiceImpl)
cacheImpl: CustomCacheImpl
# 滑动拼图底图路径(为空则使用默认底图)
# 支持全路径
# 支持项目路径,以 classpath: 开头,取 resource 目录下路径,例:classpath:images/jigsaw
# 如果使用自定义图片后,路径下需要有两个文件夹
# original(存放底图)
# slidingBlock(存放滑块)
jigsawBaseMapPath: classpath:images/jigsaw
# 点选文字底图路径(为空则使用默认底图)
# 这个只需要有一个路径集合
# 支持全路径
# 支持项目路径,以 classpath: 开头,取 resource 目录下路径,例:classpath:images/pic-click
picClickBaseMapPath: classpath:images/pic-click
# 右下角水印文字(我的水印)
# 注:这里用的是 Yml 格式的配置文件不需要做编码转换,如果项目中使用的 Properties 格式的配置文件,汉字统一使用 Unicode 可通过下面这个连接进行转换或者自行转换
# 中文转 Unicode: https://tool.chinaz.com/tools/unicode.aspx
water-mark: 你的水印
# 右下角水印文字字体(不配置时,默认使用文泉驿正黑)
# 由于宋体等涉及到版权,原作者 Aj-Captcha 在 jar 中内置了开源字体【文泉驿正黑】
# 方式一:直接配置 OS 层的现有的字体名称,比如:宋体
# 方式二:自定义特定字体,请将字体放到工程 resources 下 fonts 文件夹,支持 ttf\ttc\otf 字体
# aj.captcha.water-font=WenQuanZhengHei.ttf
waterFont: WenQuanZhengHei.ttf
# 校验滑动拼图允许误差偏移量(默认:5像素)
slipOffset: 5
# 历史数据清除开关(0:关闭;1:开启)
historyDataClearEnable: 0
## 接口限流相关
# 一分钟内接口请求次数限制开关(0:关闭;1:开启)
# 开启后所有验证码相关接口将限制一分钟内请求次数
reqFrequencyLimitEnable: 0
# 一分钟内验证码最多失败次数限制(默认:5次)
reqGetLockLimit: 5
# 一分钟内验证码最多失败次数限制达标后锁定时间(默认:300秒)
reqGetLockSeconds: 300
# 获取验证码接口一分钟内请求次数限制(默认:100次)
reqGetMinuteLimit: 100
# 校验检验码接口一分内请求次数限制(默认:100次)
reqCheckMinuteLimit: 100
# 二次校验检验码接口一分钟内请求次数限制(默认:100次)
reqVerifyMinuteLimit: 100
## 其他
# Local 缓存的阈值(默认:1000个)
# 注:只有当 cache-type 的值为 LOCAL 次参数才会生成
cacheNumber: 1000
# 定时清理过期 Local缓存(默认:180秒)
timingClear: 180
# 滑块验证码滑块干扰项(默认:0)
# 注:只有当 type 值为 BLOCKPUZZLE 此参数才生效
interferenceOptions: 0
# 点选字体样式(默认:BOLD)
fontStyle: Font.BOLD
# 点选字体大小(默认:25)
fontSize: 25
获取验证码
java
import com.anji.captcha.model.common.RepCodeEnum;
import com.anji.captcha.model.common.ResponseModel;
import com.anji.captcha.model.vo.CaptchaVO;
import com.anji.captcha.service.CaptchaService;
@RestController
@RequiredArgsConstructor
@RequestMapping("/captcha")
public class CaptchaController {
private final CaptchaService captchaService;
@Operation(summary = "获取行为验证码", description = "获取行为验证码(Base64编码)")
@GetMapping("/behavior")
public Object getBehaviorCaptcha(CaptchaVO captchaReq, HttpServletRequest request) {
captchaReq.setBrowserInfo(JakartaServletUtil.getClientIP(request) + request.getHeader(HttpHeaders.USER_AGENT));
ResponseModel responseModel = captchaService.get(captchaReq);
CheckUtils.throwIf(() -> !StrUtil.equals(RepCodeEnum.SUCCESS.getCode(), responseModel
.getRepCode()), responseModel.getRepMsg());
return responseModel.getRepData();
}
}
校验验证码
java
import com.anji.captcha.model.vo.CaptchaVO;
import com.anji.captcha.service.CaptchaService;
@RestController
@RequiredArgsConstructor
@RequestMapping("/captcha")
public class CaptchaController {
private final CaptchaService captchaService;
@Operation(summary = "校验行为验证码", description = "校验行为验证码")
@PostMapping("/behavior")
public Object checkBehaviorCaptcha(@RequestBody CaptchaVO captchaReq, HttpServletRequest request) {
captchaReq.setBrowserInfo(JakartaServletUtil.getClientIP(request) + request.getHeader(HttpHeaders.USER_AGENT));
return captchaService.check(captchaReq);
}
}
核心依赖
依赖 | 描述 |
---|---|
top.continew.starter:continew-starter-cache-redisson | 缓存模块 - Redisson |
com.anji-plus:captcha | AJ-Captcha(行为验证码,包含滑动拼图、文字点选两种方式,UI支持弹出和嵌入两种方式) |