springboot(11)使用SpringBoot validator進行數據驗證


簡介:

  數據驗證是作為一個企業級項目架構上設計的最基礎的模塊,前輩們曾說過:界面上傳遞到后台的數據沒有百分之百值得相信的!為什么這么說呢?往往我們在編寫程序的時候都會感覺后台的驗證無關緊要,這樣就會給別人空子鑽。我可以模擬前台發送的請求到后台地址,那么我如果發送一些涉及系統安全的代碼到后台,后果一發不可收拾。接下來我們就來講解下SpringBoot項目內如何對參數進行校驗!

本章目標

在SpringBoot項目內完成參數后台數據校驗。

SpringBoot的Web組件內部集成了hibernate-validator,所以我們這里並不需要額外的為驗證再導入其他的包,接下來我們先來看看SpringBoot為我們提供了哪些驗證。

一、項目構建

  使用IntelliJ IDEA工具來構建一個SpringBoot項目,預先導入Web依賴

 

二、使用驗證,書寫實體類

  我們接下來創建一個實體叫做DemoEntity,實體內添加幾個測試字段並對每個字段都做出驗證處理

復制代碼
public class DemoEntity implements Serializable
{
    @NotBlank
    @Length(min = 2,max = 10)
    private String name;

    @Min(value = 1)
    private int age;

    @NotBlank
    @Email
    private String mail;
    
    //自定義驗證,值為1或2或3,其他均不可通過驗證
    @FlagValidator(values = "1,2,3")
    private String flag;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String getMail() {
        return mail;
    }

    public void setMail(String mail) {
        this.mail = mail;
    }

    public String getFlag() {
        return flag;
    }

    public void setFlag(String flag) {
        this.flag = flag;
    }
}
復制代碼

 

三、創建一個名叫IndexController的控制器並通過頁面傳遞參數的形式來校驗數據

  我在控制器中注入了一個 MessageSource的接口對象,這個對象是用於格式化錯誤消息的。根據傳入的錯誤字段對象( FieldError)結合 hibernate-validator驗證的內置錯誤消息文件進行輸出錯誤消息, hibernate-validator的錯誤消息支持國際化,所以我們獲取錯誤消息的時候需要傳入 Locale對象獲取本地的國際化類型。hibernate-validator錯誤消息文件在對應源碼包內可以找到
復制代碼
@RestController
public class IndexController
{

    @Autowired
    private MessageSource messageSource;

    @RequestMapping(value = "/validator",method = RequestMethod.GET)
    public String validator(@Valid DemoEntity entity, BindingResult result) {
        if(result.hasErrors()) {
            StringBuffer msg = new StringBuffer();
            //獲取錯誤字段集合
            List<FieldError> fieldErrors = result.getFieldErrors();
            //獲取本地locale,zh_CN
            Locale currentLocale = LocaleContextHolder.getLocale();
            //遍歷錯誤字段獲取錯誤消息
            for (FieldError fieldError :
                    fieldErrors) {
                //獲取錯誤信息
                String errorMessage = messageSource.getMessage(fieldError,currentLocale);
                //添加到錯誤消息集合內
                msg.append(fieldError.getField()+":"+errorMessage+" , ");
            }
            return msg.toString();
        }
        return "驗證通過," + "\t名稱:" + entity.getName()+ "\t年齡:" + entity.getAge() + "\t郵箱地址:"+entity.getMail();
    }
}
復制代碼

四、運行測試

 

五、自定義驗證

1、自定義驗證注解

我們先來創建一個注解,注解內部需要對應驗證注解的驗證實現類

復制代碼
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.PARAMETER, ElementType.FIELD})
@Constraint(validatedBy = FlagValidatorClass.class)
public @interface FlagValidator
{
    //flag的有效值多個使用','隔開
    String values();
    //提示內容
    String message() default "flag不存在";

    Class<?>[] groups() default {};

    Class<? extends Payload>[] payload() default {};
}
復制代碼

 2、@Constraint注解,里面傳入了一個validatedBy的字段,這個就是我們自定義注解的實現類的類型,實現類代碼

  自定義驗證實現類里面有兩個方法,分別是初始化驗證消息、執行驗證。

  初始化驗證消息方法內你可以得到配置的注解內容,而驗證方法則是你的驗證業務邏輯。

復制代碼
public class FlagValidatorClass implements ConstraintValidator<FlagValidator, Object> {

    //臨時變量保存flag值列表
    private String values;

    //初始化values的值
    @Override
    public void initialize(FlagValidator flagValidator) {
        //將注解內配置的值賦值給臨時變量
        this.values = flagValidator.values();
    }

    //實現驗證
    @Override
    public boolean isValid(Object value, ConstraintValidatorContext constraintValidatorContext)
    {
        //分割定義的有效值
        String[] value_array = values.split(",");
        boolean isFlag = false;
        //遍歷比對有效值
        for (int i =0;i<value_array.length;i++)
        {
            //存在一致跳出循環,賦值isFlag=true
            if(value_array[i].equals(value))
            {
                isFlag = true;
                break;
            }
        }
        //返回是否存在boolean
        return isFlag;
    }
}
復制代碼

測試:


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM