在编写服务器端代码时,参数校验是确保应用程序安全性和稳定性的重要环节,本文将详细介绍参数校验的重要性、常见方法以及如何在Spring Boot项目中实现参数校验。
一、参数校验的重要性
参数校验用于检查方法调用时传递的参数是否满足特定条件,以预防和识别错误,提高代码的健壮性,通过参数校验,可以防止不合规的数据直接进入服务器,避免程序崩溃或产生不期望的结果。
二、常见的参数校验规则
非空校验
检查参数是否为null,如果参数不能为null,则必须进行非空校验。
边界值校验
检查参数值是否在预期的范围内,年龄应该是一个非负数。
格式校验
检查参数的格式是否符合预期,电子邮件地址应该符合电子邮件地址的格式。
业务规则校验
根据特定的业务规则检查参数,用户名的长度必须在6到20个字符之间。
三、在Spring Boot中实现参数校验
引入依赖
如果Spring Boot版本小于2.3.x,spring-boot-starter-web会自动传入hibernate-validator依赖,如果大于2.3.x,则需要手动引入依赖:
<dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-validator</artifactId> <version>6.0.1.Final</version> </dependency>
使用注解进行参数校验
2.1 requestBody参数校验
POST、PUT请求一般会使用requestBody传递参数,这种情况下,后端使用DTO对象进行接收,只要给DTO对象加上@Validated注解就能实现自动参数校验。
import javax.validation.constraints.Email; import javax.validation.constraints.NotBlank; import javax.validation.constraints.Size; public class User { @NotBlank(message = "用户名不能为空!") private String userName; @Email(message = "邮箱格式不正确") @NotBlank(message = "邮箱不能为空!") private String email; @NotBlank(message = "密码不能为空!") @Size(min = 6, max = 20, message = "密码长度必须在6到20个字符之间") private String password; }
在Controller层:
@PostMapping("/save") public Result saveUser(@RequestBody @Validated User user) { // 校验通过,才会执行业务逻辑处理 return Result.ok(); }
2.2 requestParam/PathVariable参数校验
GET请求一般会使用requestParam/PathVariable传参,如果参数比较多(比如超过6个),还是推荐使用DTO对象接收,否则,推荐将一个个参数平铺到方法入参中,在这种情况下,必须在Controller类上标注@Validated注解,并在入参上声明约束注解。
@RestController @Validated public class UserController { // 路径变量 @GetMapping("{userId}") public Result detail(@PathVariable("userId") @Min(10000000000000000L) Long userId) { // 校验通过,才会执行业务逻辑处理 UserDTO userDTO = new UserDTO(); userDTO.setUserId(userId); userDTO.setAccount("11111111111111111"); userDTO.setUserName("xixi"); userDTO.setAccount("11111111111111111"); return Result.ok(userDTO); } // 查询参数 @GetMapping("getByAccount") public Result getByAccount(@Length(min = 6, max = 20) @NotNull String account) { // 校验通过,才会执行业务逻辑处理 UserDTO userDTO = new UserDTO(); userDTO.setUserId(10000000000000003L); userDTO.setAccount(account); userDTO.setUserName("xixi"); userDTO.setAccount("11111111111111111"); return Result.ok(userDTO); } }
统一异常处理
为了提供更友好的错误提示,通常会用统一异常处理来返回一个更友好的提示,系统要求无论发送什么异常,HTTP状态码必须返回200,由业务码去区分系统的异常情况。
@RestControllerAdvice public class GlobalExceptionHandler { @ExceptionHandler(MethodArgumentNotValidException.class) public ResponseEntity<String> handleValidationExceptions(MethodArgumentNotValidException ex) { StringBuilder errors = new StringBuilder(); ex.getBindingResult().getAllErrors().forEach((error) -> { String errorMessage = error.getDefaultMessage(); errors.append(errorMessage).append(" "); }); return new ResponseEntity<>(errors.toString(), HttpStatus.BAD_REQUEST); } }
四、相关问题与解答
Q1: 为什么需要在服务端进行参数校验?
A1: 客户端的验证只是第一道关卡,并不安全,一旦被有心人抓到可乘之机,他就可以有各种方法来模拟系统的Http请求,访问数据库的关键数据,轻则导致服务器宕机,重则泄露数据,服务端的验证是必要的第二道关卡,以确保数据的安全性和系统的稳定运行。
Q2: Spring Boot中如何实现参数校验?
A2: Spring Boot中可以通过引入依赖包,使用注解如@Validated、@NotNull、@Email等在Controller层对参数进行校验,对于POST、PUT请求,可以使用DTO对象接收参数并加上@Validated注解;对于GET请求,可以在Controller类上标注@Validated注解,并在入参上声明约束注解。
到此,以上就是小编对于“服务器编程参数校验”的问题就介绍到这了,希望介绍的几点解答对大家有用,有任何问题和不懂的,欢迎各位朋友在评论区讨论,给我留言。
原创文章,作者:K-seo,如若转载,请注明出处:https://www.kdun.cn/ask/714058.html