SpringBoot 集成 AJ-Captcha 实现滑动验证码,保姆级教程 + 避坑指南
一、前言
在 Web 开发中,验证码是防止恶意攻击、暴力破解、机器人刷接口的核心防线,而滑动验证码相比传统图形验证码,体验更流畅、安全性更高,是目前主流的验证方案。
本文基于AJ-Captcha(安居客开源的滑动验证码组件),手把手教你在SpringBoot + Spring Security项目中集成滑动验证码、点选验证码,解决接口放行、配置优化、前后端对接等问题,代码可直接复用!
二、AJ-Captcha 简介
AJ-Captcha 是一款开源、轻量、无侵入的 Java 验证码组件,支持:
滑动验证码(拼图):最常用,用户体验极佳
点选验证码:文字 / 图片点选,安全性更高
支持本地缓存 / Redis 缓存,支持接口限流、超时设置
开箱即用,无需复杂配置,适配 SpringBoot/SpringMVC
官方 GitHub:aj-captcha
三、环境准备
1. 核心依赖
在pom.xml中引入 AJ-Captcha 启动器,1.4.0 版本稳定易用:
<!-- AJ-Captcha 滑动验证码核心依赖 -->
<dependency>
<groupId>com.anji-plus</groupId>
<artifactId>captcha-spring-boot-starter</artifactId>
<version>1.4.0</version>
</dependency>
- 项目结构(参考)
com.itl.project
├── system/controller/CaptchaCodeController.java # 验证码接口控制器
├── framework/config/SecurityConfig.java # SpringSecurity配置
└── application.yml # 验证码配置文件
四、后端核心代码实现
1. 验证码控制器(CaptchaCodeController)
提供获取验证码和校验验证码两个核心接口,直接调用 AJ-Captcha 提供的CaptchaService即可,无需手写逻辑:
package com.itl.project.system.controller;
import com.anji.captcha.model.common.ResponseModel;
import com.anji.captcha.model.vo.CaptchaVO;
import com.anji.captcha.service.CaptchaService;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
/**
* 滑动验证码接口控制器
*/
@RestController
@RequestMapping("/captcha")
public class CaptchaCodeController {
// AJ-Captcha 核心服务类
@Resource
private CaptchaService captchaService;
/**
* 获取验证码(支持GET/POST)
* @param captchaType 验证码类型:slide(滑动)、block(点选)
* @return 验证码图片、坐标等数据
*/
@RequestMapping(value = "/get", method = {RequestMethod.GET, RequestMethod.POST})
public ResponseModel get(@RequestParam(value = "type", defaultValue = "slide") String captchaType) {
CaptchaVO captchaVO = new CaptchaVO();
captchaVO.setCaptchaType(captchaType);
return captchaService.get(captchaVO);
}
/**
* 校验验证码
* @param captchaVO 前端传递的验证数据(唯一标识+滑动坐标)
* @return 验证结果:成功/失败
*/
@PostMapping("/check")
public ResponseModel check(@RequestBody CaptchaVO captchaVO) {
return captchaService.check(captchaVO);
}
}
2. YML 配置文件
在application.yml中添加验证码配置,自定义图片、缓存、限流规则:
aj:
captcha:
aes-status: false # 关闭AES加密(测试环境,生产可开启)
cache-type: local # 缓存类型:local(本地)、redis(分布式)
expires-in: 300 # 验证码有效期:5分钟(单位秒)
req-frequency-limit-count: 50 # 接口限流:50次/分钟
cache-number: 1000 # 本地缓存最大数量
jigsaw: classpath:images/jigsaw # 滑动验证码背景图存放路径
pic-click: classpath:images/pic-click # 点选验证码背景图路径
slip-offset: 30 # 滑动误差允许值(像素) 越大精度越好 也就是越容易通过
3. Spring Security 放行验证码接口(关键!)
如果项目使用Spring Security,必须放行/captcha/get和/captcha/check接口,否则会被拦截无法访问:
// SecurityConfig.java 核心配置
@Override
protected void configure(HttpSecurity httpSecurity) throws Exception {
httpSecurity
.csrf().disable()
.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS).and()
.authorizeRequests()
// 放行登录、验证码接口
.antMatchers(
"/login",
"/captcha/get", // 放行获取验证码
"/captcha/check" // 放行校验验证码
).permitAll()
// 其他请求需要认证
.anyRequest().authenticated();
}
五、前后端对接流程
1. 前端请求获取验证码
前端调用GET /captcha/get?type=slide接口;
后端返回背景图、滑块图、唯一标识(token);
前端渲染滑动验证码组件,用户拖动滑块完成验证。
2. 前端提交验证结果
前端将验证码 token + 滑动坐标封装为CaptchaVO;
调用POST /captcha/check接口提交验证;
后端返回验证结果,验证通过后才可执行登录 / 提交表单。
3. 接口返回格式(标准 JSON)
// 获取验证码成功
{
"repCode": "0000",
"repMsg": "success",
"data": {
"captchaType": "slide",
"token": "xxxx-xxxx-xxxx",
"backgroundImage": "data:image/png;base64,xxxx",
"sliderImage": "data:image/png;base64,xxxx"
}
}
// 验证成功
{
"repCode": "0000",
"repMsg": "验证成功",
"data": true
}
六、常见问题 & 避坑指南
1. 验证码接口 401/403 无权限
原因:Spring Security 未放行接口
解决方案:在SecurityConfig中添加/captcha/**放行规则。
2. 本地运行正常,部署服务器报错
原因:服务器未加载验证码背景图
解决方案:确保classpath:images/目录下存在验证码图片,或改为绝对路径。
3. 验证码验证失败(坐标不匹配)
原因:滑动误差值设置过小
解决方案:调大slip-offset(建议 30-50 像素)。
4. 分布式环境下验证码失效
原因:使用本地缓存cache-type: local
解决方案:改为cache-type: redis,集成 Redis 缓存。
七、扩展优化
生产环境开启 AES 加密:aes-status: true,防止前端数据篡改;
自定义验证码图片:替换jigsaw和pic-click路径下的图片,适配项目风格;
接口限流:调整req-frequency-limit-count,防止恶意刷接口;
结合登录接口:登录前强制校验验证码,验证通过才执行登录逻辑。
八、总结
AJ-Captcha 是 SpringBoot 项目集成滑动验证码的最优选择,核心优势:
✅ 零代码侵入,仅需控制器 + 配置文件即可完成集成;
✅ 支持滑动 / 点选双验证码模式,满足不同场景;
✅ 适配 Spring Security,轻松解决权限拦截问题;
✅ 轻量高效,支持分布式部署,生产环境稳定可用。
DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐



所有评论(0)