分享一個圖片驗證碼功能的實現

Web_hls發表於2020-10-06

專案地址

https://github.com/smallsnail-wh/wh-validate

實現原理

  1. /validate/imag請求獲取驗證碼圖片,並將驗證碼資訊存入session
  2. 使用filter來驗證請求中驗證碼是否正確。
  3. 提供ImageCodePropertiesConfigurerAdapterValidateCodeGenerator
    來自定義驗證碼圖片。

使用方法

  • 將專案中com.wh.validate.demo包中的所有程式碼copy到你的專案,完成相關依賴的匯入(可參考此專案本身)。
  • 專案提供預設網址:/validate/image,來獲取驗證碼圖片。
  • 實現ImageCodePropertiesConfigurerAdapter介面並註冊為bean,配置需要驗證的url,可配置多個。

注意 驗證請求中必須以 imageCode=”XXXX”(XXXX為驗證字串),這樣的引數形式傳入。(若驗證請求為post形式,資料格式必須為application/x-www-form-urlencoded

@Component
public class ImageCodePropertiesConfigurerAdapterTemp implements ImageCodePropertiesConfigurerAdapter {

    @Override
    public void imageCodePropertiesConfigure(ImageCodeDefaultProperties imageCodeDefaultProperties) {
        imageCodeDefaultProperties.setUrl("/login","/logintest");
    }
}
  • 如果驗證錯誤會返回json {“error”:403,”message”:”驗證碼不匹配”}

自定義配置

分兩種情況:1.完全使用你自己的圖片驗證碼樣式。2,使用此專案圖片驗證樣式,但是改變寬高,以及驗證碼字元數量和驗證碼過期時間。

如果完全使用你自己的圖片驗證碼樣式,你需要實現ValidateCodeGenerator並註冊為bean。在createImageCode中返回ImageCode

@Component
public class ImageCodeGenertorTemp implements ValidateCodeGenerator {

    @Override
    public ImageCode createImageCode(HttpServletRequest req) throws IOException {
        //你生產的驗證碼圖片
        BufferedImage image;
        //驗證碼圖片對應的字串
        String code;
        //過期時間(單位秒)
        int expireIn;

        ImageCode imageCode = new ImageCode(image,code,expireIn);
        return imageCode;
    }

}

如果使用此專案圖片驗證樣式,但是改變寬高,以及驗證碼字元數量和驗證碼過期時間,你可以直接在實現ImageCodePropertiesConfigurerAdapter介面的那個類中,直接配置。

@Component
public class ImageCodePropertiesConfigurerAdapterTemp implements ImageCodePropertiesConfigurerAdapter {

    @Override
    public void imageCodePropertiesConfigure(ImageCodeDefaultProperties imageCodeDefaultProperties) {
        imageCodeDefaultProperties.setSize(5).setHeight(50).setWidth(200).setExpireIn(60).setUrl("/login","/logintest");
    }

}

相關文章