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;


    //其他属性

}

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

相关推荐
深色風信子9 小时前
SpringBoot 集成 LangChain4j RAG Redis 搜索
spring boot·langchain4j rag·rag redis 搜索·rag redis·springboot rag·rag 搜索
小蒜学长10 小时前
springboot餐厅信息管理系统设计(代码+数据库+LW)
java·数据库·spring boot·后端
Jabes.yang10 小时前
Java大厂面试实录:从Spring Boot到微服务的技术探讨
java·spring boot·spring cloud·微服务·技术面试
咖啡Beans11 小时前
SpringBoot集成MongoDB使用
spring boot·mongodb
q_191328469512 小时前
基于RuoYi框架+Mysql的汽车进销存后台管理系统
数据库·vue.js·spring boot·mysql·汽车·个人开发·若依
悟能不能悟12 小时前
springboot在DTO使用service,怎么写
java·数据库·spring boot
__XYZ12 小时前
RedisTemplate 实现分布式锁
java·spring boot·redis·分布式·junit
Cc001085213 小时前
【AI学习笔记】用AI生成spring boot + redis
spring boot·笔记·学习·ai编程
thginWalker14 小时前
使用Spring Boot构建Web服务层
spring boot