前言
参数验证很重要,是平时开发环节中不可少的一部分,但是我想很多后端同事会偷懒,干脆不错,这样很可能给系统的稳定性和安全性带来严重的危害。那么在Spring Boot应用中如何做好参数校验工作呢,本文提供了10个小技巧,你知道几个呢?
1.使用验证注解
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
2 使用自定义验证注解
虽然 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
类中定义的验证逻辑。
3 在服务器端验证
除了前端或者客户端做了验证意外,服务器端验证输入是至关重要的。它可以确保在处理或存储任何恶意或格式错误的数据之前将其捕获,这对于应用程序的安全性和稳定性至关重要。
假设我们有一个允许用户创建新帐户的 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
参数以触发验证过程。
-
参数
+关注
关注
11文章
1863浏览量
32489 -
校验
+关注
关注
0文章
41浏览量
12693 -
spring
+关注
关注
0文章
340浏览量
14428 -
Boot
+关注
关注
0文章
150浏览量
36015
发布评论请先 登录
相关推荐
Spring Boot嵌入式Web容器原理是什么
Spring Boot从零入门1 详述
Spring Boot实现各种参数校验
Spring Boot特有的实践
强大的Spring Boot 3.0要来了
Spring Boot Web相关的基础知识
简述Spring Boot数据校验
SpringBoot参数验证的10个技巧1
Spring Boot应用中如何做好参数校验?2
Spring Boot Actuator快速入门
Spring Boot启动 Eureka流程

Spring Boot的启动原理

评论