Springboot3整合使用ja-captcha行為驗證碼解決方案

2023-04-20 18:01:41

截止到目前,Springboot最新穩定版本已經迭代到3.0.5,而我們專案中使用的行為驗證碼框架ja-captcha還沒有適配Springboot3,碼雲上類似的請求也沒有得到過迴應,於是決定自己動手適配一下,研究下來發現適配3.x並沒有那麼難,這裡記錄一下適配過程,希望能幫到他人

首先搭建一個Springboot2的專案,以最簡單的方法整合驗證碼,這裡我選擇使用springboot2.7.5ja-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,還是希望作者早日做適配