Spring MVC表单验证

时间:2021-02-15 00:57:02

服务端进行表单验证,是为了保证前端传入数据的准确、安全。

一个简单的请求示例

新建一个类Req_FormCheck,作为请求参数,代码如下:

@Data
@ToString
@NoArgsConstructor
public class Req_FormCheck {


    private String name;

    private String sex;

    private Integer age;

    private String email;

}

新建控制器,并实现一个简单的接口请求,代码如下

@RestController
@RequestMapping("/api/test/formCheck")
public class TestFormCheckController {

    /**
     * 表单验证测试
     * @param req
     * @return
     */
    @RequestMapping(value = "/demo",method = RequestMethod.POST)
    public String demo(@RequestBody Req_FormCheck req){

        return "success";
    }
}

为了方便测试,这里直接新建一个单元测试,代码如下:

/**
 * web请求测试(control层测试)
 * webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT  设置随机端口
 */
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
@RunWith(SpringRunner.class)
public class WebRequestTests {

    @Autowired
    private TestRestTemplate restTemplate;

    @Test
    public void testCheckForm(){
        Req_FormCheck req=new Req_FormCheck();
        req.setName("张三");
        req.setAge(1000);
        ResponseEntity<String> result = restTemplate.postForEntity("/api/test/formCheck/demo",req, String.class);
        System.out.println(result.getBody());
    }

}

然后运行下测试,测试结果如下:

Spring MVC表单验证

接口返回了”success“,这样一个简单的请求示例代码就完成了。

 

实现后端的表单验证

我们构建了一个简单的请求,但是针对这个请求,后端没有进行任何验证!我们需要在Req_FormCheck这个类中设定验证规则,来保证数据的合法、安全。在javax.validation.constraints.*中定义了一系列的JSR 303规范给出的注解,先看看一些常用的注解。

验证注解
注解 作用
@Null 被注释的对象必须为null
@NotNull 被注释的对象不能为null
@NotEmpty 被注释的对象不能为null,不能为空字符串""
@NotBlank

被注释的对象是不是Null还有被Trim的长度是否大于0,只对字符串,且会去掉前后空格

@AssertTrue 被注释的对象必须为true
@AssertFalse 被注释的对象必须为false
@Size(min=,max=)  被注释的对象的值是否在指定的范围内
@Length(min=,max=)  被注释的对象的长度是否在指定的范围内
@Min 被注释的对象必须是一个数字,值必须大于等于指定的值
@Max 被注释的对象必须是一个数字,值必须小于等于指定的值
@DecimalMin 被注释的对象的值必须大于等于指定的值。这个指定的值是一个通过BigDecimal定义的最大值的字符串表示,小数存在精度
@DecimalMax

被注释的对象的值必须小于等于指定的值。这个指定的值是一个通过BigDecimal定义的最大值的字符串表示,小数存在精度

@Range(min=, max=) 检查数字是否介于min和max之间
@Past 被注释的对象必须是一个过去的日期
@Future 被注释的对象必须是一个将来的日期
@Pattern 被注释的对象必须符合指定的正则表达式
@CreditCardNumber 信用卡验证
@Email 邮箱验证

修改请求类,增加验证规则,代码如下:

@Data
@ToString
@NoArgsConstructor
public class Req_FormCheck {

    @NotEmpty(message = "必须传入name参数,且name传入的值不能是空字符串")
    private String name;

    //@NotNull 表示必须传入,但可以传入空字符串
    @NotNull(message = "必须传入sex参数")
    private String sex;

    private Integer age;

    @NotEmpty(message = "必须传入email参数,且email传入的值不能是空字符串")
    @Email(message = "email如果有传入且是非空字符串,值必须传入邮箱格式")
    private String email;

}

修改控制器中的接口,增加@Valid,用于启用注解式的验证,如果验证失败,则接口返回失败信息,代码如下(红色方框为新增的代码):

Spring MVC表单验证

这样,我们就完成了后端验证的代码。

 测试下,修改测试代码如下:

Spring MVC表单验证

 由于传入的email参数不是邮箱格式,所有接口返回如下:

Spring MVC表单验证

 可以尝试修改传入的参数来进行测试。