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