Skip to content

验证码模块:行为验证码

简介

continew-starter-captcha-behavior 是 ContiNew Starter 验证码模块针对行为验证码的默认处理,底层基于 AJ Captcha。

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

主要特性

  • 版本锁定:涉及依赖已进行版本锁定,使用时无需配置版本
  • 提供两种行为验证支持方式
    • 滑动验证(滑动滑块至图片的具体位置)
    • 点选验证(按照程序指定顺序依次点击图片中的文字)

配置示例

配置详情请查看:top.charles7c.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

获取验证码

可参考 top.charles7c.continew.admin.webapi.common.CaptchaController 类中 getBehaviorCaptcha方法

请求参数

json
{
  "captchaType": "blockPuzzle",  //验证码类型 blockPuzzle(滑动验证) clickWord(点选验证)
  "clientUid": "唯一标识"  //客户端UI组件id,组件初始化时设置一次,UUID(非必传参数)
}

返回参数

json
{
  "secretKey": "oRnD35nHUCDr8RU2",
  "originalImageBase64": "底图base64",
  "point":
  {
    "x": 205,
    "y": 5
  },
  "jigsawImageBase64": "滑块图base64",
  "token": "52dc607d50684395aa0a16b285964e58"
}

接口示例

java
  // 项目中注入 CaptchaService 验证码服务类即可使用
  private final CaptchaService captchaService;
  
  @GetMapping("/get")
  public Object get(CaptchaVO captchaReq, HttpServletRequest request) {
    // 这里设置 BrowserInfo 为后续做接口请求限制做唯一标识,保证值唯一即可,如果请求参数中携带了 clientUid 参数则此行代码可以删除
    captchaReq.setBrowserInfo(JakartaServletUtil.getClientIP(request) + request.getHeader(HttpHeaders.USER_AGENT));
    return captchaService.get(captchaReq).getRepData();
    }

校验验证码

可参考 top.charles7c.continew.admin.webapi.common.CaptchaController 类中 checkBehaviorCaptcha方法

请求参数

json
{
  "captchaType": "blockPuzzle",
  "pointJson": "QxIVdlJoWUi04iM+65hTow==",  //aes加密坐标信息
  "token": "71dd26999e314f9abb0c635336976635"  //get请求返回的token
}

返回参数

json
{
  "captchaType": "blockPuzzle",
  "token": "71dd26999e314f9abb0c635336976635",
  "result": true,
  "opAdmin": false
}

接口示例

java
  // 项目中注入 CaptchaService 验证码服务类即可使用
  private final CaptchaService captchaService;
  
  @PostMapping("/check")
    public Object check(@RequestBody CaptchaVO captchaReq) {
        return captchaService.check(captchaReq);
    }

核心依赖

依赖描述
continew-starter-cache-redisson
captchaAJ-Captcha(行为验证码,包含滑动拼图、文字点选两种方式,UI支持弹出和嵌入两种方式)