JSR303後端校驗
什麼是JSR303?
JSR 303 - Bean Validation提供了一種後端數據校驗支持,如果一鍵f12修改前端代碼成功繞過前端校驗,那麼就會存入非法數據,所以後端校驗十分重要。應該前端+後端+數據庫的校驗約束都不能少,全面保障數據規範安全。
導入jar包
在pom.xml引入依賴,不瞭解Maven可以點這裏。
<!-- JSR303數據校驗支持 -->
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-validator</artifactId>
<version>5.1.0.Final</version>
</dependency>
<!-- tomcat7以下el表達式版本不兼容的話,還要導入下面jar包-->
<dependency>
<groupId>javax.el</groupId>
<artifactId>javax.el-api</artifactId>
<version>3.0.0</version>
</dependency>
校驗規則
Constraint | 詳細信息 |
---|---|
@Null | 被註釋的元素必須爲 null |
@NotNull | 被註釋的元素必須不爲 null |
@AssertTrue | 被註釋的元素必須爲 true |
@AssertFalse | 被註釋的元素必須爲 false |
@Min(value) | 被註釋的元素必須是一個數字,其值必須大於等於指定的最小值 |
@Max(value) | 被註釋的元素必須是一個數字,其值必須小於等於指定的最大值 |
@DecimalMin(value) | 被註釋的元素必須是一個數字,其值必須大於等於指定的最小值 |
@DecimalMax(value) | 被註釋的元素必須是一個數字,其值必須小於等於指定的最大值 |
@Size(max, min) | 被註釋的元素的大小必須在指定的範圍內 |
@Digits (integer, fraction) | 被註釋的元素必須是一個數字,其值必須在可接受的範圍內 |
@Past | 被註釋的元素必須是一個過去的日期 |
@Future | 被註釋的元素必須是一個將來的日期 |
@Pattern(value) | 被註釋的元素必須符合指定的正則表達式 |
被註釋的元素必須是電子郵箱地址 | |
@Length | 被註釋的字符串的大小必須在指定的範圍內 |
@NotEmpty | 被註釋的字符串的必須非空 |
@Range | 被註釋的元素必須在合適的範圍內 |
上面是官網給出的所有校驗規則,其中@Pattern是比較常用的,可以自定義規則。
在屬性上添加註解
在JavaaBean的屬性上加上註解,其中message設置錯誤信息,可以不寫使用默認。
public class User {
@NotNull(message="×:賬號不能爲空")
private Integer uid;
@NotNull
@Length(min=6,max=20,message="×:密碼長度須爲6-20")
private String password;
@Pattern(regexp="(^[a-zA-Z0-9_-]{3,16}$)|(^[\u2E80-\u9FFF]{2,5})"
,message="×:用戶名爲2-5中文或3-16英文數字組合")
private String name;
//@Pattern(regexp="^([a-zA-Z0-9_\\.-]+)@([\\da-z\\.-]+)\\.([a-z\\.]{2,6})$"
// ,message="×:郵箱格式錯誤")
@Email
private String email;
@Past
private Date birthday;
添加@Valid註解
在Controller方法的參數上加上@Valid註解,出錯後的錯誤信息會放在 BindingResult 的對象參數中。
@PostMapping("/user")
@ResponseBody
public Msg saveUser(@Valid User user,BindingResult result){
if (result.hasErrors()){
Map<String,Object> map = new HashMap<>();
//校驗失敗,應該返回失敗,在模態框中顯示校驗失敗的錯誤信息
List<FieldError> errors = result.getFieldErrors();
for (FieldError fieldError:errors){
System.out.println("錯誤的字段名:"+fieldError.getField());
System.out.println("錯誤信息:"+fieldError.getDefaultMessage());
map.put(fieldError.getField(),fieldError.getDefaultMessage());
}
return Msg.fail().add("errorFields",map);
}else {
userService.saveUser(user);
return Msg.success();
}
}
你的點贊將會是我最大的動力