Springboot3整合使用ja-captcha行为验证码解决方案
截止到目前,Springboot最新稳定版本已经迭代到3.0.5,而我们项目中使用的行为验证码框架ja-captcha还没有适配Springboot3,码云上类似的请求也没有得到过回应,于是决定自己动手适配一下,研究下来发现适配3.x并没有那么难,这里记录一下适配过程,希望能帮到他人

首先搭建一个Springboot2的项目,以最简单的方法整合验证码,这里我选择使用springboot2.7.5和ja-captcha1.3.0,在Maven中添加依赖后直接启动项目即可
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.7.5</version>
</parent>
<groupId>site.hanzhe.boot3.captcha</groupId>
<artifactId>springboot3-ja-captcha</artifactId>
<version>0.0.1</version>
<description>Springboot3整合ja-captcha行为验证码解决方案</description>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>com.anji-plus</groupId>
<artifactId>spring-boot-starter-captcha</artifactId>
<version>1.3.0</version>
</dependency>
</dependencies>
</project>

可以看到已经整合成功了,而且调用接口测试也一切正常,现在将Springboot版本改成3.0.5,然后刷新Maven后重启一下项目试试看,发现控制台已经不打印ja-captcha的日志了,而且接口也返回404

在整合之前,我们需要了解一下Springboot3.x的两个重要的变化
第一个变化是Springboot3以JakartaEE 9为基准并支持JakartaEE 10,其实Jakarta就是Java,Oracle将JavaEE移交给了Eclipse基金会,并不允许其使用原本的java名称,所以Java改名为Jakarta,原javax包名也修改为了jakarta
第二个变化是Springboot自动配置文件的变更,Springboot3废弃了factories的自动配置,改为使用imports文件
了解这两点后我们回到整合验证码的项目中,首先可以观察到最明显的一点,启动项目后控制台不在打印ja-captcha的日志了,这就代表自动配置并没有生效,在外部库中找到ja-captcha的自动配置,发现它是使用factories进行自动配置的,该方法已经失效,我们需要创建新的自动配置文件来启用它
在resource目录下新建META-INF/spring两个目录,在目录下添加自动配置文件,并将ja-captcha的自动配置类添加进去然后重启项目查看效果,文件名太长我就放在代码块中了
# 文件名
org.springframework.boot.autoconfigure.AutoConfiguration.imports
# 文件内容
com.anji.captcha.config.AjCaptchaAutoConfiguration

可以看到项目启动报错了,不过不用担心,报错是好事儿,说明自动配置生效了,提取报错中的主要信息,是创建captchaController这个Bean的时候报错了,报错的原因是没有找到javax/servlet/http/HttpServletRequest这个类,因为Springboot3中javax的包名统一修改为了jakarta,所以这个类会找不到
这里直接使用替换法简单粗暴的解决这个问题,找到报错的这个类,在项目中创建一个相同包名的的类,将里面的javax替换为jakarta,这样在创建Bean的时候Java找到的类是我们自己的jakarta的类,就不会调用旧的javax的类了

替换后重启项目查看效果,可以发现项目已经启动成功了,并且控制台打印了ja-captcha的启动日志,调试接口也成功了
本文使用笨方法在Springboot3中使用ja-captcha,还是希望作者早日做适配
Springboot3整合使用ja-captcha行为验证码解决方案的更多相关文章
- VisualCaptcha – 灵活的可视化验证码解决方案
visualCaptcha 是一个可配置的验证码解决方案,专注于可访问性和简单性,同时保持安全性.它也支持移动,视网膜设备,并有一个创新的可访问性的解决方案. visualCaptcha 现在可以跨多 ...
- python爬虫模拟登录验证码解决方案
[前言]几天研究验证码解决方案有三种吧.第一.手工输入,即保存图片后然后我们手工输入:第二.使用cookie,必须输入密码一次,获取cookie:第三.图像处理+深度学习方案,研究生也做相关课题,就用 ...
- 使用.Net Core 2.1开发Captcha图片验证码服务
更新后续篇:Captcha服务(后续1) 使用.Net Core 2.1开发Captcha验证码服务 开发工具:Visual Studio 2017 15.7.3 开发平台:64位 Windows 1 ...
- captcha ~ 生成验证码图片
验证码在我们的世界中可以保护我们的信息安全的一个保障之一 这就是生成验证码的代码 # 导报 from captcha.image import ImageCaptcha #验证码的包 from ...
- Lumen5.7快速实现Captcha图片验证码功能
公司发送短信注册的接口需要防刷,需要一个图形验证码,不考虑收费产品. Lumen5.7+nginx+mysql 使用了这个作者的扩展包,只讲实现.https://github.com/Youngyez ...
- django学习,captcha图形验证码的使用
很多网站在登录或者注册的时候都有验证码,让你去输入. 刚好有这么一款插件,可以满足这个功能 首先,先pip install django-simple-captcha 然后再setting里添加,如 ...
- Lumen 实现接口 Captcha图片验证码功能
安装 composer require youngyezi/captcha 使用 新版的包已经删除了 session 支持,完全交给业务自由选择存储方式 个人觉得这样更方便来解耦业务,尤其 Lumen ...
- Discuz!NT3.6与网站整合(操作用户信息)解决方案
因为网站要加个论坛,所以就用到了Discuz!NT3.6. 可惜目前官方论坛已经关闭,只有3.6版本的有源码,3.9的没有源码,不好操作,下载地址: http://download.comsenz.c ...
- thinkphp整合系列之短信验证码、订单通知
现在这个短信通知泛滥的年代:应用如果没有个短信注册:你都不敢说你是搞开发的: 这个验证码搞起来是不难的:但是如果刚接触也是有点不知从哪下手的迷茫: 先讲下概念: 要想发送验证码:需要至少三项:appi ...
- laravel整合JWT遇到的问题及解决方案
1.在执行 php artisan jwt:secret 生成密钥的时候,报错Method Tymon\JWTAuth\Commands\JWTGenerateCommand::handle() do ...
随机推荐
- Hyper-V 直连主机USB设备
因为授权问题不让用 Vmware 了.所以换成微软自带的 Hyper V 但是碰到一个很头痛的问题,就是外部设备没法像 Vmware 那样直接连接到虚拟机里面,很多第三方设备没法调试了. 找了很久终于 ...
- mssql实现Split
create function Fun_Split( @SourceSql varchar ( 8000 ), @StrSeprate varchar ( 10 )) returns @temp ta ...
- php上传文件时出现 caution: request is not finished yet
其中的一个原因:是wamp64下的tmp文件夹中的临时文件太多,把这个文件夹的临时文件清理后就可以了.
- celery工作原理和代码
1.celery介绍 pip install celery == 4.4.7 pip install redis == 3.5.3 pip install eventlet == 0.26.1 Cel ...
- Rstudio R get filename full path
FILENAME=basename(rstudioapi::getActiveDocumentContext()$path) FULLPATH=dirname(rstudioapi::getActiv ...
- 文件搜索失败:cannot update repo 'Media": No LRO_ URLS, LRO_MIRRORLISTURL nOr LRO _METALINKURL specified
配置yum源 1.产看当前系统版本 cat /etc/redhat-release 2.进入/etc/yum.repos.d目录,新建bak目录,将系统自带的yum移到bak目录 cd /etc/yu ...
- [极客大挑战 2019]PHP 1
进入后提示我们网页有备份文件,这边使用爆破工具,网页会down掉 随便随便猜了一下www.zip,成功下载源码 常见的网页备份有 .git ~ .swp .swo .bak .zip 还不知道是什么题 ...
- MGF multivariate generating function 多变量生成函数
目录 MGF多变量生成函数multivariate generating function 定义 例子 Extremal parameters III.8.1 largest components 例 ...
- Quicker快速开发,简单的网页数据爬取(示例,获取天眼查指定公司基础工商数据)
前言 有某个线上项目,没有接入工商接口,每次录入公司的时候,都要去天眼查.企查查或者其他公开数据平台,然后手动录入,一两个还好说,数量多了的重复操作就很烦,而且,部分数据是包含超链接,一不注意就点进去 ...
- 微信-JSSDK网页调用-(微信扫一扫)
网页调用微信扫一扫接口 1.准备工作: 1.1微信浏览器 1.2微信APPID,nonceStr 2.使用方式快速预览 调用扫一扫微信接口. 1需要获取access_token 2获取 $jsapi ...