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;


    //其他属性

}

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

相关推荐
摇滚侠2 小时前
Spring Boot 3零基础教程,新特性 ProblemDetails,笔记50
spring boot·笔记
朝新_4 小时前
【SpringBoot】详解Maven的操作与配置
java·spring boot·笔记·后端·spring·maven·javaee
程序定小飞7 小时前
基于springboot的电影评论网站系统设计与实现
java·spring boot·后端
苹果醋37 小时前
JAVA面试汇总(二)多线程(五)
运维·vue.js·spring boot·nginx·课程设计
兜兜风d'8 小时前
RabbitMQ 持久性详解
spring boot·分布式·rabbitmq·1024程序员节
问道飞鱼9 小时前
【微服务组件】Springboot结合Dubbo实现RPC调用
spring boot·微服务·rpc·dubbo
I'm Jie10 小时前
(二)Gradle 依赖仓库及安全凭证配置
java·spring boot·spring·gradle·maven
李少兄11 小时前
记一次 Spring Boot 项目中 Redis 工具类的重构实践
spring boot·redis·重构
摇滚侠12 小时前
Spring Boot3零基础教程,生命周期启动加载机制,笔记64
spring boot·笔记
摇滚侠12 小时前
Spring Boot3零基础教程,整合 Redis,笔记69
spring boot·redis·笔记