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;


    //其他属性

}

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

相关推荐
暗冰ཏོ4 小时前
Spring Boot + Vue3 订单支付模块技术实现:支付单、回调验签、幂等处理与余额扣减
前端·spring boot·后端·vue·微信支付·支付宝支付
ACGkaka_5 小时前
Spring Boot 实战(四十一):集成 BPMN(Flowable+bpmn-js)
java·spring boot·后端
ljs6482739515 小时前
智慧商城(Smart Mall):基于 Spring Boot + Vue 3 的现代化电商平台实战
linux·vue.js·spring boot·后端
添砖java_8575 小时前
网页聊天室测试报告
java·spring boot·spring·maven
whaledown6 小时前
互联网大厂Java求职面试三轮提问详解(涵盖Spring Boot、微服务、Kafka等核心技术)
java·jvm·数据库·spring boot·微服务·面试·kafka
paopaokaka_luck16 小时前
英语单词学习系统的设计与实现(基于艾宾浩斯遗忘曲线的智能复习机制、语音朗读、多题型测试与错题自动收录、Echarts图形化分析)
vue.js·spring boot·后端·echarts
爱敲代码的小鱼1 天前
springboot原理篇:
java·spring boot·spring
默默敲代码的徐哥儿1 天前
八股文整理——后端
java·开发语言·spring boot·后端·学习
牧小七1 天前
宠物管理系统2026
spring boot
名字还没想好☜1 天前
Spring Boot 全局异常处理:@ControllerAdvice 实战
java·spring boot·后端·spring·异常处理