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();
}
}
进行测试
上一篇: 将博客搬至CSDN
下一篇: artTemplate 自定义语法扩展