• Springboot3整合使用aj-captcha行为验证码解决方案


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

    image

    首先搭建一个Springboot2的项目,以最简单的方法整合验证码,这里我选择使用springboot2.7.5aj-captcha1.3.0,在Maven中添加依赖后直接启动项目即可

    
    <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.0modelVersion>
        <parent>
            <groupId>org.springframework.bootgroupId>
            <artifactId>spring-boot-starter-parentartifactId>
            <version>2.7.5version>
        parent>
        <groupId>site.hanzhe.boot3.captchagroupId>
        <artifactId>springboot3-aj-captchaartifactId>
        <version>0.0.1version>
        <description>Springboot3整合aj-captcha行为验证码解决方案description>
    
        <dependencies>
            <dependency>
                <groupId>org.springframework.bootgroupId>
                <artifactId>spring-boot-starter-webartifactId>
            dependency>
            <dependency>
                <groupId>com.anji-plusgroupId>
                <artifactId>spring-boot-starter-captchaartifactId>
                <version>1.3.0version>
            dependency>
        dependencies>
    
    project>
    

    image

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

    image

    在整合之前,我们需要了解一下Springboot3.x的两个重要的变化

    第一个变化是Springboot3以JakartaEE 9为基准并支持JakartaEE 10,其实Jakarta就是Java,Oracle将JavaEE移交给了Eclipse基金会,并不允许其使用原本的java名称,所以Java改名为Jakarta,原javax包名也修改为了jakarta

    第二个变化是Springboot自动配置文件的变更,Springboot3废弃了factories的自动配置,改为使用imports文件

    了解这两点后我们回到整合验证码的项目中,首先可以观察到最明显的一点,启动项目后控制台不在打印aj-captcha的日志了,这就代表自动配置并没有生效,在外部库中找到aj-captcha的自动配置,发现它是使用factories进行自动配置的,该方法已经失效,我们需要创建新的自动配置文件来启用它

    在resource目录下新建META-INF/spring两个目录,在目录下添加自动配置文件,并将aj-captcha的自动配置类添加进去然后重启项目查看效果,文件名太长我就放在代码块中了

    # 文件名
    org.springframework.boot.autoconfigure.AutoConfiguration.imports
    
    # 文件内容
    com.anji.captcha.config.AjCaptchaAutoConfiguration
    

    image

    可以看到项目启动报错了,不过不用担心,报错是好事儿,说明自动配置生效了,提取报错中的主要信息,是创建captchaController这个Bean的时候报错了,报错的原因是没有找到javax/servlet/http/HttpServletRequest这个类,因为Springboot3中javax的包名统一修改为了jakarta,所以这个类会找不到

    这里直接使用替换法简单粗暴的解决这个问题,找到报错的这个类,在项目中创建一个相同包名的的类,将里面的javax替换为jakarta,这样在创建Bean的时候Java找到的类是我们自己的jakarta的类,就不会调用旧的javax的类了

    image

    替换后重启项目查看效果,可以发现项目启动成功,并且控制台打印了aj-captcha的启动日志,调试接口也成功了,整合完成,点击查看代码

    本文使用笨方法在Springboot3中使用aj-captcha,还是希望作者早日做适配

  • 相关阅读:
    从0开始python学习-53.python中flask创建简单接口
    【JAVA】Spring(中)注解开发&整合Mybatis&整合JUnit
    C++信息学奥赛1191:流感传染
    leetcode:105从前序与中序遍历序列构造二叉树
    一台机器下,多个Java版本的粗放与精细管理
    Linux(Centos)防火墙允许通过端口增加操作记录
    16-数据结构-图的存储结构
    【Vue3-Vite】Vite配置--路径别名配置
    Java之线程详解(一)——线程概念知识、创建线程的几种方式
    CUDA学习笔记8——GPU硬件资源
  • 原文地址:https://www.cnblogs.com/hanzhe/p/17337168.html