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) 被註釋的元素必須符合指定的正則表達式
@Email 被註釋的元素必須是電子郵箱地址
@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();
	        }
	}

你的點贊將會是我最大的動力

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章