validation 自定義特殊字元校驗
阿新 • • 發佈:2021-01-30
自定義特殊字元校驗
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;
最後
這樣的話,在呼叫介面時,就會自動丟擲不能輸入特殊字元的提示