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


