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;


    //其他属性

}

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

相关推荐
ruleslol1 天前
SpringBoot面试题03-BeanFactory
spring boot
刘一说1 天前
深入理解 Spring Boot 中的数据库迁移:Flyway 与 Liquibase 实战指南
数据库·spring boot·oracle
一叶飘零_sweeeet1 天前
SpringBoot 集成 RabbitMQ
spring boot·rabbitmq·java-rabbitmq
知兀1 天前
【Spring/SpringBoot】<dependencyManagement> + import 导入能继承父maven项目的所有依赖,类似parent
spring boot·spring·maven
郝开1 天前
Spring Boot 2.7.18(最终 2.x 系列版本):版本概览;兼容性与支持;升级建议;脚手架工程搭建
java·spring boot·后端
清水1 天前
Spring Boot企业级开发入门
java·spring boot·后端
Q_Q5110082851 天前
python+django/flask的校园活动中心场地预约系统
spring boot·python·django·flask·node.js·php
水冗水孚1 天前
类比前端知识来学习Java的Spring Boot实现MySql的全栈CRUD功能——搭配Svelte+Vite
spring boot·svelte
淘源码d1 天前
什么是医院随访系统?成熟在用的智慧随访系统源码
java·spring boot·后端·开源·源码·随访系统·随访系统框架
Q_Q19632884751 天前
python+django/flask基于机器学习的就业岗位推荐系统
spring boot·python·django·flask·node.js·php