springBoot进行表单校验

tech2026-04-07  1

一、前言

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

二、所需依赖包

这里用的是 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_-]+@[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(); } }

进行测试

 

最新回复(0)