SpringBoot中参数验证的技巧

参数验证很重要,是开发环节中不可少的一部分,但是有些很多后端同事会偷懒,干脆不做,这样很可能给系统的稳定性和安全性带来严重的危害。那么在SpringBoot应用中如何做好参数校验工作呢,本文来介绍一下参数验证的技巧。

使用SpringBoot自带注解验证

SpringBoot提供了内置的验证注解,可以帮助我们简单高效的验证参数,包括参数是否为NULL,是否为空串或者空格等等,也有特定格式参数的验证,例如邮箱格式或者符合某个正则的格式。

一些最常用的验证注释包括:

@NotNull:指定字段不能为空。
@NotEmpty:指定列表字段不能为空。
@NotBlank:指定字符串字段不得为空或仅包含空格。
@Min 和 @Max:指定数字字段的最小值和最大值。
@Pattern:指定字符串字段必须匹配的正则表达式模式。
@Email:指定字符串字段必须是有效的电子邮件地址。

举个例子,如果我们有一个实体类user,我们可以对user的各个字段的格式进行校验:

less 复制代码
public class User {
@NotNull(message = "用户id不能为空")
private Long id;


@NotBlank(message = "用户名不能为空")
@Size(min = 2, max = 50)
private String firstName;


@NotBlank
@Size(min = 2, max = 50)
private String lastName;


@Email(message = "邮箱格式不正确")
private String email;


@NotNull
@Min(value = 18, message = "年龄必须大于18")
@Max(value = 99, message = "年龄必须小于99")
private Integer age;


@Pattern(regexp = "[A-Z]{2}\d{4}")
private String employeeId;
}

添加完验证条件之后就是怎么触发这些验证,我们只需要用到@Valid注解,下面是一个针对用户的controller,我们只需要在User请求体的前面加上@Valid注解就可以触发验证了。

less 复制代码
@RestController
@RequestMapping("/users")
public class UserController {


    @PostMapping("/")
    public ResponseEntity<?> createUser(@RequestBody @Valid User user) {
        // 逻辑处理
        return ResponseEntity.ok("User created");
    }
}

自定义注解验证

上面介绍的是我们常用的一些验证注解,如果我们需要自定义一个验证逻辑该怎么做呢,这个时候就需要我们自定义验证注解了。例如,上面的user实体类中有一个密码password属性,密码格式为大于八位且包含数字大写字母小写字母。那么这个自定义注解怎么写呢?

首先,我们需要定义一个注解@ValidPassword

less 复制代码
@Target({ElementType.FIELD, ElementType.METHOD, ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = ValidPasswordValidator.class)
public @interface ValidPassword {

    String message() default "密码格式不正确!";

    Class<?>[] groups() default {};

    Class<? extends Payload>[] payload() default {};
}

然后定义验证器

typescript 复制代码
public class ValidPasswordValidator implements ConstraintValidator<ValidPassword, String> {

    @Override
    public void initialize(ValidPassword constraintAnnotation) {
        // 初始化,如有需要
    }

    @Override
    public boolean isValid(String value, ConstraintValidatorContext context) {
        if (value == null) {
            return false;
        }

        boolean hasUppercase = value.chars().anyMatch(Character::isUpperCase);
        boolean hasLowercase = value.chars().anyMatch(Character::isLowerCase);
        boolean hasDigit = value.chars().anyMatch(Character::isDigit);

        return value.length() >= 8 && hasUppercase && hasLowercase && hasDigit;
    }
}

我们验证逻辑都写在了isValid方法中,initialize方法中可以做一些配置或设置工作。

最后一步我们就可在user类中使用我们自定义的注解了,使用方法和触发方法和上面的SpringBoot的验证注解是一样的。

kotlin 复制代码
public class User {

    @ValidPassword
    private String password;


    //其他属性

}

以上两种方法就是我们常用的参数验证的方法。

相关推荐
用户8307196840827 小时前
Spring Boot 集成 RabbitMQ :8 个最佳实践,杜绝消息丢失与队列阻塞
spring boot·后端·rabbitmq
Java水解8 小时前
Spring Boot 视图层与模板引擎
spring boot·后端
Java水解8 小时前
一文搞懂 Spring Boot 默认数据库连接池 HikariCP
spring boot·后端
洋洋技术笔记12 小时前
Spring Boot Web MVC配置详解
spring boot·后端
初次攀爬者1 天前
Kafka 基础介绍
spring boot·kafka·消息队列
用户8307196840821 天前
spring ai alibaba + nacos +mcp 实现mcp服务负载均衡调用实战
spring boot·spring·mcp
Java水解1 天前
SpringBoot3全栈开发实战:从入门到精通的完整指南
spring boot·后端
初次攀爬者2 天前
RocketMQ在Spring Boot上的基础使用
java·spring boot·rocketmq
花花无缺2 天前
搞懂@Autowired 与@Resuorce
java·spring boot·后端
Derek_Smart2 天前
从一次 OOM 事故说起:打造生产级的 JVM 健康检查组件
java·jvm·spring boot