学习spring boot参数校验记录

这几天在看参数校验,老规矩分享出来。

依然接上一篇 学习自动化测试记录 的代码,使用 javax.validation.constraints.* 来进行校验

个人水平所限,肯定会有很多不足,请指正

项目路径:https://github.com/hallowold/elasticSearchDemo1

个人建议是这一篇直接down下来看代码方便些

这回的比较杂,举例来说

1.先说几个常用的

@NotNull 非空     @Min  最小值   @Max  最大值  @Size(min=xx,max=xx)  字符串类型长度  

另外还有些别的,这些基础的类型网上一搜一大把,就不一一说了

这几个没啥可说的,要注意的是min和max都是用来校验数字型参数,纯数字组成的字符串也可以,但一定记住他只能校验你的数值,size要注意只能用于String类型参数

2.正则表达式判断

@Pattern 

这个是重头戏,只要是字符串类型参数,总是绕不开恶意攻击的问题,举几个我见过的场景,sql注入,xss注入,输入特殊字符如换行,打表等,这时候我们就需要用正则来判断了。正则是一个很不错的工具,建议没事了都去看看,顺便贴一个测试站点

http://www.runoob.com/try/try.php?filename=tryjsref_regexp3

给出几个个人场景中的应用

校验restful风格url的字符串 :  ^(/[A-Za-z0-9]+)+((/\\{[A-Za-z0-9]+\\})*(/[A-Za-z0-9]+)*)*{1,500}

不能包括转义字符,不可视字符,英文单双引号和以下几个字符 $ % & = ? ,      :  [^%&'\",;=?$\\x22]

3.自定义注解

有时候还会碰到这种情况,比如我的参数必须是某几个,又比如我的参数必须是某种格式,这时候就需要我们自己去做这个注解

给出两个例子

校验Integer[]类型格式

import com.example.demo.common.config.ValidationStaticValues;

import javax.validation.Constraint;
import javax.validation.Payload;
import java.lang.annotation.Documented;
import java.lang.annotation.Retention;
import java.lang.annotation.Target;

import static java.lang.annotation.ElementType.ANNOTATION_TYPE;
import static java.lang.annotation.ElementType.FIELD;
import static java.lang.annotation.ElementType.METHOD;
import static java.lang.annotation.RetentionPolicy.RUNTIME;

/**
 * @author : liuqitian
 * @date : 2018/7/18 10:12
 * @version : V1.2
 * 校验指定字段是否是int数组或空值,若为int数组,则应为空数组,或者每个元素长度都不能超过9位
 *  调用接口
 */
@Target( { METHOD, FIELD, ANNOTATION_TYPE })
@Retention(RUNTIME)
@Constraint(validatedBy = IntegerArrayValidator.class)
@Documented
public @interface IntegerArray {

    String message() default ValidationStaticValues.START_FLAG + ValidationStaticValues.VALID_INTEGER_ARRAY;

    Class<?>[] groups() default {};

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

}
import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;

/**
 * @author : liuqitian
 * @date : 2018/7/18 10:12
 * @version : V1.2
 * 校验指定字段是否是int数组或空值,若为int数组,则应为空数组,或者每个元素长度都不能超过9位
 *  实现类
 */
public class IntegerArrayValidator implements ConstraintValidator<IntegerArray, Object> {

    @Override
    public void initialize(IntegerArray constraintAnnotation) {}

    @Override
    public boolean isValid(Object value, ConstraintValidatorContext context) {
        /*正常情况下,传入的数组肯定是输入String数组,然后由String数组转型的Integer数组传递过来,
         *  所以直接判断是否为Integer[]即可,不对的都是异常数据*/
        //注意,因为业务需求,这里规定空值可以通过校验
        if (null == value) { return true; }
        boolean flag = false;
        if(value instanceof Integer[]) {
            for (Integer data : (Integer[]) value) {
                //这里只应该是1-9位的正整数
                if(data >= 1000000000 || data < 1) { return false; }
            }
            flag = true;
        }
        return flag;
    }

}

校验传递的字符串参数是否是一个http请求类型

import com.example.demo.common.config.ValidationStaticValues;

import javax.validation.Constraint;
import javax.validation.Payload;
import java.lang.annotation.Documented;
import java.lang.annotation.Retention;
import java.lang.annotation.Target;

import static java.lang.annotation.ElementType.ANNOTATION_TYPE;
import static java.lang.annotation.ElementType.FIELD;
import static java.lang.annotation.ElementType.METHOD;
import static java.lang.annotation.RetentionPolicy.RUNTIME;

/**
 * @author : liuqitian
 * @date : 2018/7/18 10:12
 * @version : V1.2
 * 校验指定字段是否是httpMethod
 *  调用接口
 */
@Target( { METHOD, FIELD, ANNOTATION_TYPE })
@Retention(RUNTIME)
@Constraint(validatedBy = MethodTypeValidator.class)
@Documented
public @interface MethodType {

    String message() default ValidationStaticValues.START_FLAG + ValidationStaticValues.VALID_METHOD_TYPE;

    Class<?>[] groups() default {};

    Class<? extends Payload>[] payload() default {};
}
import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;

/**
 * @author : liuqitian
 * @date : 2018/7/18 10:12
 * @version : V1.2
 * 校验指定字段是否是httpMethod
 *  实现类
 */
public class MethodTypeValidator implements ConstraintValidator<MethodType, String> {

    private String[] methods = {"GET", "POST", "DELETE", "PUT", "TRACE", "HEAD", "OPTIONS", "CONNECT", "ALL"};

    @Override
    public void initialize(MethodType constraintAnnotation) {}

    @Override
    public boolean isValid(String value, ConstraintValidatorContext context) {   // 实现校验规则
        if (null == value) { return false; }
        for (String data : methods) {
            if(data.equalsIgnoreCase(value)) {
                return true;
            }
        }
        return false;
    }

}

猜你喜欢

转载自blog.csdn.net/m0_37536493/article/details/81127605