欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

springBoot进行表单校验

程序员文章站 2022-05-03 10:30:36
...

一、前言

在进行表单提交时,一般会对参数进行校验,及时返回给用户进行提示,使用户能够正确输入。

二、所需依赖包

这里用的是 SpringBoot 配置项目,本文讲解的重点是后端接口,导入

 <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-validation</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <scope>runtime</scope>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
            <exclusions>
                <exclusion>
                    <groupId>org.junit.vintage</groupId>
                    <artifactId>junit-vintage-engine</artifactId>
                </exclusion>
            </exclusions>
        </dependency>

三、参数校验

一个接口一般对参数(请求数据)都会进行安全校验,参数校验的重要性自然不必多说,那么如何对参数进行校验就有讲究了。

业务层校验

首先我们来看一下最常见的做法,就是在业务层进行参数校验:

public String addUser(User user) {
     if (user == null || user.getId() == null ) {
         return "对象或者对象字段不能为空";
     }
   //.....
     if (!Pattern.matches("^[a-zA-Z0-9_-]aaa@qq.com[a-zA-Z0-9_-]+(\\.[a-zA-Z0-9_-]+)+$", user.getEmail())) {
         return "邮箱格式不正确";
     }
     // 参数校验完毕后这里就写上业务逻辑
     return "success";
}

这样做当然是没有什么错的,而且格式排版整齐也一目了然。不过这样太繁琐了,这还没有进行业务操作呢光是一个参数校验就已经这么多行代码,实在不够优雅。

Validator + BindResult 进行校验

Validator 可以非常方便的制定校验规则,并自动帮你完成校验。首先在入参里需要校验的字段加上注解,每个注解对应不同的校验规则,并可制定校验失败后的信息:

package com.hzau.springdemo.model;

import lombok.Data;

import javax.validation.constraints.Email;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;

/**
 * @ClassName User
 * @Description TODO
 * @Author yueyiming
 * @Date 2020/9/4 11:27
 * @Version 1.0
 * https://blog.csdn.net/hzau_itdog
 **/

@Data
public class User {
    @NotNull(message = "用户id不能为空")
    private Long id;

    @NotBlank(message = "用户账号不能为空")
    @Size(min = 6, max = 11, message = "账号长度必须是6-11个字符")
    private String account;

    @NotBlank(message = "用户密码不能为空")
    @Size(min = 6, max = 11, message = "密码长度必须是6-16个字符")
    private String password;

    @Email(message = "邮箱格式不正确")
    @NotBlank(message = "用户邮箱不能为空")
    private String email;
}

其他注解

@Null    限制只能为null
@NotNull 限制必须不为null
@AssertFalse  限制必须为false
@AssertTrue 限制必须为true
@DecimalMax(value)   限制必须为一个不大于指定值的数字
@DecimalMin(value)  限制必须为一个不小于指定值的数字
@Digits(integer,fraction)  限制必须为一个小数,且整数部分的位数不能超过integer,小数部分的位数不能超过fraction
@Future 限制必须是一个将来的日期
@Max(value) 限制必须为一个不大于指定值的数字
@Min(value) 限制必须为一个不小于指定值的数字
@Past 限制必须是一个过去的日期
@Pattern(value) 限制必须符合指定的正则表达式
@Size(max,min) 限制字符长度必须在min到max之间
@NotBlank(message =)   验证字符串非null,且长度必须大于0    很适合String 参数验证
@Email  被注释的元素必须是电子邮箱地址    
@Length(min=,max=)  被注释的字符串的大小必须在指定的范围内    
@NotEmpty   被注释的字符串的必须非空    
@Range(min=,max=,message=)  被注释的元素必须在合适的范围内

 

校验规则和错误提示信息配置完毕后,接下来只需要在接口需要校验的参数上加上  @Validated 注解,

package com.hzau.springdemo.controller;

import com.hzau.springdemo.model.User;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * @ClassName UserController
 * @Description TODO
 * @Author yueyiming
 * @Date 2020/9/4 11:28
 * @Version 1.0
 * https://blog.csdn.net/hzau_itdog
 **/
@RestController
public class UserController {
    @PostMapping(value = "test")
    public Object test(@Validated User user){

        return user;

    }
}

然后自定义全局异常处理

package com.hzau.springdemo.controller;

import org.springframework.validation.BindException;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;

/**
 * @ClassName MyControllerAdvice
 * @Description TODO
 * @Author yueyiming
 * @Date 2020/9/4 11:46
 * @Version 1.0
 * https://blog.csdn.net/hzau_itdog
 **/
@RestControllerAdvice
public class MyControllerAdvice {

    @ExceptionHandler(value = BindException.class)
    public String MethodArgumentNotValidExceptionHabdler(BindException exception){
       return exception.getBindingResult().getAllErrors().get(0).getDefaultMessage();
    }
}

进行测试

springBoot进行表单校验

 

相关标签: web开发