返回

论如何对Springboot参数进行校验:全面、可靠、必知

后端

Springboot 参数校验:保障后端安全的利器

参数校验的必要性

随着互联网应用的蓬勃发展,后端接口的安全问题不容小觑。恶意用户通过精心构造的非法参数,可能绕过前端校验,直接攻击后端服务器,造成数据泄露、系统崩溃等严重后果。因此,在后端对参数进行校验是至关重要的。

Springboot 参数校验的优势

Springboot 是一个强大的 Java 框架,在参数校验方面具有诸多优势:

  • 简单易用: 提供丰富的注解和工具,简化参数校验,降低开发难度。
  • 全面可靠: 涵盖入参校验、出参校验和异常处理,满足不同场景的需求。
  • 性能优异: 基于 Java 反射机制实现,性能高效,不会影响系统性能。

Springboot 参数校验的实现

Springboot 提供了以下注解进行参数校验:

  • @RequestParam: 校验请求参数。
  • @PathVariable: 校验路径参数。
  • @RequestBody: 校验请求体参数。
  • @ModelAttribute: 校验模型属性参数。

这些注解都有一个共同属性:value ,用于指定校验规则。校验规则可以是简单的类型校验,也可以是复杂的表达式校验。

入参校验示例

@PostMapping("/save")
public void save(@RequestBody @Valid User user) {
    // 校验 user 对象,校验不通过会抛出 MethodArgumentNotValidException 异常。
}

使用 @RequestBody@Valid 注解对请求体参数进行校验。@RequestBody 映射请求体 JSON 数据到 User 对象,@Valid 校验 User 对象是否符合校验规则。若校验不通过,Springboot 将抛出 MethodArgumentNotValidException 异常。

出参校验示例

@GetMapping("/get")
public User get(@RequestParam @Valid Integer id) {
    // 校验 id 参数,校验不通过会抛出 MethodArgumentNotValidException 异常。
    return userService.get(id);
}

使用 @RequestParam@Valid 注解对请求参数进行校验。@RequestParam 从请求参数中获取 id 参数,@Valid 校验 id 参数是否符合校验规则。若校验不通过,Springboot 将抛出 MethodArgumentNotValidException 异常。

异常处理

参数校验不通过时,Springboot 会抛出 MethodArgumentNotValidException 异常。可以通过 @ControllerAdvice@ExceptionHandler 注解处理该异常。

@ControllerAdvice
public class GlobalExceptionHandler {

    @ExceptionHandler(MethodArgumentNotValidException.class)
    public ResponseEntity<String> handleMethodArgumentNotValidException(MethodArgumentNotValidException ex) {
        List<String> errors = ex.getBindingResult().getAllErrors().stream().map(ObjectError::getDefaultMessage).collect(Collectors.toList());
        return ResponseEntity.badRequest().body(String.join(",", errors));
    }

}

@ControllerAdvice@ExceptionHandler 注解处理 MethodArgumentNotValidException 异常。若校验不通过,Springboot 调用 handleMethodArgumentNotValidException 方法,返回校验错误信息给客户端。

常见问题解答

  • 为什么需要参数校验?

    • 参数校验可防止非法参数攻击后端服务器,保障系统安全。
  • Springboot 参数校验有哪些优势?

    • 简单易用,全面可靠,性能优异。
  • 如何进行入参校验?

    • 使用 @RequestBody@Valid 注解对请求体参数校验。
  • 如何进行出参校验?

    • 使用 @RequestParam@Valid 注解对请求参数校验。
  • 如何处理参数校验异常?

    • 使用 @ControllerAdvice@ExceptionHandler 注解处理 MethodArgumentNotValidException 异常。