1. 程式人生 > 其它 >validation 自定義特殊字元校驗

validation 自定義特殊字元校驗

技術標籤:javaspring

自定義特殊字元校驗

1、問題原因

前端呼叫後端介面時有時,有時某個入參使用者會輸入特殊字元,從而導致後端報錯,比如`[email protected]#$%^&+= 這些字元,但是又不能每個去做業務校驗,太麻煩

2、解決方案

所以想到了使用java validate來校驗某個入參是不是有特殊字元,具體方法如下:
定義特殊字元校驗類,自定義特殊字元校驗註解,@NotSpecialChar ,並實現ConstraintValidator介面,在需要校驗特殊字元的欄位上加上@NotSpecialChar註解即可

2.1、自定義特殊字元校驗註解

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

import static java.lang.annotation.RetentionPolicy.RUNTIME;
/** * 特殊字元註解 * * @author TonyStark * @date 2020/7/16 4:49 下午 */ @Target({ElementType.FIELD}) @Retention(RUNTIME) @Documented @Constraint(validatedBy = NotSpecialCharValidator.class) public @interface NotSpecialChar { String message() default "{param.invalid}"; Class<?>[] groups
() default {}; Class<? extends Payload>[] payload() default {}; }

2.2、實現ConstraintValidator介面

可以自己修改如下程式碼,適應自己業務需要,當下會校驗 `[email protected]#$%^&+= 特殊字元

import lombok.extern.slf4j.Slf4j;

import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.util.regex.PatternSyntaxException;

/**
 * 特殊字元校驗類 包含以下字元時 `[email protected]#$%^&+= 會觸發
 *
 * @author TonyStark
 * @date 2020/7/16 4:48 下午
 */
@Slf4j
public class NotSpecialCharValidator implements ConstraintValidator<NotSpecialChar,String> {
    @Override
    public boolean isValid(String value, ConstraintValidatorContext validatorContext) {

        try {
            String result = StringFilterUtil(value);
            return "".equals(result);
        } catch (Exception e) {
            log.error("特殊字元異常:",e);
            return false;
        }
    }

    /**
     * 判斷是否包含特殊字元
     * @param str 如此那
     * @throws PatternSyntaxException 丟擲未經檢查的異常,表明正則表示式模式中的語法錯誤
     */
    private static String StringFilterUtil(String str) throws PatternSyntaxException {
        if(null == str){
            str = "";
        }
        StringBuilder result = new StringBuilder();
        // 識別所有特殊字元
        String regEx = "[`[email protected]#$%^&+=]";
        Pattern p = Pattern.compile(regEx);
        Matcher matcher = p.matcher(str);
        while(matcher.find()) {
            result.append(matcher.group(0)).append(",");
        }
        if (result.length() > 0) {
            String resultStr = result.substring(0,result.length() -1);
            log.error("特殊字元:["+resultStr+"]");
            return resultStr;
        }else {
            return "";
        }

    }
}

2.3、具體使用

(另外如需生效,需要在controller 方法引數上加 @Valid註解,如下圖)
在這裡插入圖片描述
需要校驗的欄位:

    /**
     * 合同名稱
     */
    @NotSpecialChar(message = "不能輸入特殊字元")
    private String contractName;

最後

這樣的話,在呼叫介面時,就會自動丟擲不能輸入特殊字元的提示