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();
	        }
	}

你的点赞将会是我最大的动力

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