您的当前位置:首页正文

自定义校验--校验json长度

2024-11-29 来源:个人技术集锦

mysql8中支持json格式的字段,某些情况下使用很方便,但也带来一个问题,就是它的最大长度不能设置,最大支持4GB,如果有恶意程序保存一条4GB的数据进去,估计这张表就要卡死了,所以要加一个自定义校验,校验下json的长度,这里使用hibernate validator校验

添加注解 

这里加个JsonLength注解,message就是校验不通过返回的默认信息,value就是最大长度,默认1024

@Target({ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = JsonLengthValidator.class)
public @interface JsonLength {
    String message() default "最大长度不能超过{value}";

    // 自定义的验证组
    Class<?>[] groups() default {}; // 这里可以指定一个或多个验证组类

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

    // 可以添加自定义参数
    int value() default 1024;
}

添加校验类

initialize方法是初始化的时候执行,可以在这里获取到配置的值,每个@JsonLength注解都会实例化一个对象,isValid方法是每次校验时调用,先把对象序列化成json字符串,然后比较下是否超过最大长度就行了

public class JsonLengthValidator implements ConstraintValidator<JsonLength, Object> {
    private int maxLength;

    @Override
    public void initialize(JsonLength constraintAnnotation) {
        maxLength = constraintAnnotation.value();
    }

    @Override
    public boolean isValid(Object value, ConstraintValidatorContext context) {
        if (value == null) return true;
        // 序列化成字符串,判断长度
        String jsonStr = JsonUtils.serialize(value);
        return jsonStr.length() <= maxLength;
    }
}

最后只要在新增的controller方法里面加上@Validated注解就可以了

显示全文