当前位置: 首页 > news >正文

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>
  1. 项目结构(参考)
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;importcom.anji.captcha.model.common.ResponseModel;importcom.anji.captcha.model.vo.CaptchaVO;importcom.anji.captcha.service.CaptchaService;importorg.springframework.web.bind.annotation.*;importjavax.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);returncaptchaService.get(captchaVO);}/** * 校验验证码 * @param captchaVO 前端传递的验证数据(唯一标识+滑动坐标) * @return 验证结果:成功/失败 */ @PostMapping("/check")public ResponseModel check(@RequestBody CaptchaVO captchaVO){returncaptchaService.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,轻松解决权限拦截问题;
✅ 轻量高效,支持分布式部署,生产环境稳定可用。

http://www.jsqmd.com/news/1199496/

相关文章:

  • 在飞牛私有云fnOS上本地部署DeepSeek-R1:8B模型实操指南
  • 河南开封宋城文武学校武术夏令营开启!河南正规文武学校排名公布 - 学途指南
  • 2026年口碑好的长白山特色民宿推荐 - 谁都没有我好看
  • Windows消息机制解析与应用实践
  • Rumored 集中维权看海外服饰品牌知识产权布局:商品实拍素材确权维权逻辑
  • Cursor Browser Visual Editor:前端开发的浏览器原生外挂
  • JavaScript 两个凸多边形之间的切线(Tangents between two Convex Polygons)
  • ​给父母买食用油应该怎么选?多力这款油营养安全双满分 - 资讯焦点
  • AI如何革新CUDA编程:从强化学习到性能优化
  • pdf转excel最简单方法有哪些?盘点免费在线和本地工具,哪个更省心 - 资讯报道
  • 2026重庆黄金出手别踩亏!全域正规回收门店盘点,透明计价无隐形扣费 - 衡金阁
  • VS Code插件发布全流程:从vsce打包到Marketplace上架避坑指南
  • AI 会抢走哪些人的工作?真正危险的可能不是某个职业
  • Automated HIV Screening on Dutch Electronic Health Records with Large Language Models
  • CentOS 7.9环境搭建与Linux核心技能实战指南
  • C 语言工业级通用组件手写 04:阻塞队列
  • 鼠源CD3E与CD3G异二聚体蛋白的结构特征与应用价值
  • XUnity.AutoTranslator:如何让Unity游戏实现智能实时翻译的完整指南
  • Dify平台:可视化AI应用开发的核心技术与实践
  • Gemini 3.5 新手极速上手指南
  • Windows消息机制:原理、实现与优化技巧
  • 安卓逆向入门:从APK结构解析到动态Hook实战指南
  • 中欧EMBA真的适合外企高管吗?民企占比、适配人群一次讲透 - 资讯快报
  • pdf转excel软件靠谱吗?从出差高铁贴票说起,这三类方案亲测有效 - 资讯报道
  • 武汉钻石回收避坑指南|看懂4C计价逻辑,拆解钻戒变现全套套路 - 奢侈品回收评测
  • Android 8.1精准安装Frida 12.8.10并配置VSCode代码提示完整指南
  • WSL2环境搭建与开发配置全指南
  • 【Atlas】如何优化 Solr 查询性能以提升 Atlas 搜索速度?
  • 2026佛山顺德区卖黄金别踩本地专属套路!30年连锁易奢福大盘金价,结算无额外收费 - 奢侈品回收实体店
  • 东莞LOGO设计公司视维品牌:用策略型视觉,陪制造业把品牌做“实“