电子说
参数验证很重要,是平时开发环节中不可少的一部分,但是我想很多后端同事会偷懒,干脆不错,这样很可能给系统的稳定性和安全性带来严重的危害。那么在Spring Boot应用中如何做好参数校验工作呢,本文提供了10个小技巧,你知道几个呢?
Spring Boot
提供了内置的验证注解,可以帮助简单、快速地对输入字段进行验证,例如检查 null 或空字段、强制执行长度限制、使用正则表达式验证模式以及验证电子邮件地址。
一些最常用的验证注释包括:
@NotNull
:指定字段不能为空。@NotEmpty
:指定列表字段不能为空。@NotBlank
:指定字符串字段不得为空或仅包含空格。@Min
和 @Max
:指定数字字段的最小值和最大值。@Pattern
:指定字符串字段必须匹配的正则表达式模式。@Email
:指定字符串字段必须是有效的电子邮件地址。具体用法参考下面例子:
public class User {
@NotNull
private Long id;
@NotBlank
@Size(min = 2, max = 50)
private String firstName;
@NotBlank
@Size(min = 2, max = 50)
private String lastName;
@Email
private String email;
@NotNull
@Min(18)
@Max(99)
private Integer age;
@NotEmpty
private List
虽然 Spring Boot 的内置验证注释很有用,但它们可能无法涵盖所有情况。如果有特殊参数验证的场景,可以使用 Spring 的 JSR 303 验证框架创建自定义验证注释。自定义注解可以让你的的验证逻辑更具可重用性和可维护性。
假设我们有一个应用程序,用户可以在其中创建帖子。每个帖子都应该有一个标题和一个正文,并且标题在所有帖子中应该是唯一的。虽然 Spring Boot 提供了用于检查字段是否为空的内置验证注释,但它没有提供用于检查唯一性的内置验证注释。在这种情况下,我们可以创建一个自定义验证注解来处理这种情况。
首先,我们创建自定义约束注解UniqueTitle
:
@Target({ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = UniqueTitleValidator.class)
public @interface UniqueTitle {
String message() default "Title must be unique";
Class?[] groups() default {};
Class? extends Payload[] payload() default {};
}
接下来,我们创建一个PostRepository
接口,目的是从数据库中检索帖子:
public interface PostRepository extends JpaRepository<Post, Long> {
Post findByTitle(String title);
}
然后我们需要定义验证器类 UniqueTitleValidator
,如下所示:
@Component
public class UniqueTitleValidator implements ConstraintValidator<UniqueTitle, String> {
@Autowired
private PostRepository postRepository;
@Override
public boolean isValid(String title, ConstraintValidatorContext context) {
if (title == null) {
return true;
}
return Objects.isNull(postRepository.findByTitle(title));
}
}
UniqueTitleValidator
实现了ConstraintValidator
接口,它有两个泛型类型:第一个是自定义注解UniqueTitle
,第二个是正在验证的字段类型(在本例中为String
). 我们还自动装配了PostRepository
类以从数据库中检索帖子。
isValid()
方法通过查询 PostRepository
来检查 title
是否为 null 或者它是否是唯一的。如果 title
为 null 或唯一,则验证成功,并返回 true。
定义了自定义验证注释和验证器类后,我们现在可以使用它来验证 Spring Boot 应用程序中的帖子标题:
public class Post {
@UniqueTitle
private String title;
@NotNull
private String body;
}
我们已将 @UniqueTitle
注释应用于 Post
类中的 title
变量。验证此字段时,这将触发 UniqueTitleValidator
类中定义的验证逻辑。
除了前端或者客户端做了验证意外,服务器端验证输入是至关重要的。它可以确保在处理或存储任何恶意或格式错误的数据之前将其捕获,这对于应用程序的安全性和稳定性至关重要。
假设我们有一个允许用户创建新帐户的 REST
端点。端点需要一个包含用户用户名和密码的 JSON 请求体。为确保输入有效,我们可以创建一个 DTO(数据传输对象)类并将验证注释应用于其字段:
public class UserDTO {
@NotBlank
private String username;
@NotBlank
private String password;
}
我们使用@NotBlank
注解来确保username
和password
字段不为空或 null。
接下来,我们可以创建一个控制器方法来处理 HTTP POST 请求并在创建新用户之前验证输入:
@RestController
@RequestMapping("/users")
@Validated
public class UserController {
@Autowired
private UserService userService;
@PostMapping
public ResponseEntity
我们使用 Spring 的@Validated
注解来启用方法级验证,我们还将 @Valid
注释应用于 userDto
参数以触发验证过程。
全部0条评论
快来发表一下你的评论吧 !