Skip to content

行为验证码 (behavior)

最后更新: 17 小时前
实践版本: v2.13.4

简介

continew-starter-captcha-behavior 是 ContiNew Starter 验证码模块针对行为验证码的默认实现,底层基于 AJ Captcha,提供滑动验证和点选验证两种方式。

主要特性

  • 两种验证方式:支持滑动验证(滑动滑块至图片的具体位置)和点选验证(按照指定顺序点击图片中的文字)
  • 灵活配置:支持配置缓存(已提供内存、Redisson,也可自定义)、底图路径、缓存类型、水印文字等

快速开始

引入依赖

pom.xml
xml
<dependency>
    <groupId>top.continew.starter</groupId>
    <artifactId>continew-starter-captcha-behavior</artifactId>
</dependency>

添加配置

配置详情请查看:top.continew.starter.captcha.behavior.autoconfigure.BehaviorCaptchaProperties

application.yml
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:captchaAJ-Captcha(行为验证码,包含滑动拼图、文字点选两种方式,UI支持弹出和嵌入两种方式)