Spring MVC表单验证

Posted yvan0013

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spring MVC表单验证相关的知识,希望对你有一定的参考价值。

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

一个简单的请求示例

新建一个类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());
    


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

接口返回了”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,用于启用注解式的验证,如果验证失败,则接口返回失败信息,代码如下(红色方框为新增的代码):

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

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

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

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

以上是关于Spring MVC表单验证的主要内容,如果未能解决你的问题,请参考以下文章

Spring MVC 表单验证不适用于嵌套的复杂类型

Spring-MVC:需要最简单的表单处理、绑定和验证示例

带有 i18n 消息的 Spring-MVC + RESTeasy 表单 bean 验证 (JSR 303)

由于 Spring MVC 中不存在 URL,验证表单提交按钮在第二次尝试后返回 404

Spring 3 MVC:使用自定义验证器显示验证消息

如何使用 Spring Security / Spring MVC 处理表单登录