SpringBoot中引數驗證的使用
阿新 • • 發佈:2022-04-01
spring boot
中可以用@Validated
來校驗資料,如果資料異常則會統一丟擲異常,方便異常中心統一處理。
註解引數說明
註解名稱 | 功能 |
---|---|
@Xss | 檢查該欄位是否存在跨站指令碼工具 |
@Null | 檢查該欄位為空 |
@NotNull | 不能為null |
@NotBlank | 不能為空,常用於檢查空字串 |
@NotEmpty | 不能為空,多用於檢測list是否size是0 |
@Max | 該欄位的值只能小於或等於該值 |
@Min | 該欄位的值只能大於或等於該值 |
@Past | 檢查該欄位的日期是在過去 |
@Future | 檢查該欄位的日期是否是屬於將來的日期 |
檢查是否是一個有效的email地址 | |
@Pattern(regex=,flag=) | 被註釋的元素必須符合指定的正則表示式 |
@Range(min=,max=,message=) | 被註釋的元素必須在合適的範圍內 |
@Size(min=, max=) | 檢查該欄位的size是否在min和max之間,可以是字串、陣列、集合、Map等 |
@Length(min=,max=) | 檢查所屬的欄位的長度是否在min和max之間,只能用於字串 |
@AssertTrue | 用於boolean欄位,該欄位只能為true |
@AssertFalse | 該欄位的值只能為false |
資料校驗使用
1、基礎使用 因為spring boot
已經引入了基礎包,所以直接使用就可以了。首先在controller
@Validated
需要對資料進行校驗。
2、然後在對應欄位Get方法
加上引數校驗註解,如果不符合驗證要求,則會以message
的資訊為準,返回給前端。
自定義註解校驗
使用原生的@Validated
進行引數校驗時,都是特定的註解去校驗(例如欄位長度、大小、不為空等),我們也可以用自定義的註解去進行校驗,例如專案中的@Xss
註解。
1、新增Xss
註解,設定自定義校驗器XssValidator.class
/**
* 自定義xss校驗註解
*
* @author ruoyi
*/
@Retention(RetentionPolicy.RUNTIME)
@Target(value = { ElementType.METHOD, ElementType.FIELD, ElementType.CONSTRUCTOR, ElementType.PARAMETER })
@Constraint(validatedBy = { XssValidator.class })
public @interface Xss
{
String message()
default "不允許任何指令碼執行";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
}
2、自定義Xss
校驗器,實現ConstraintValidator
介面。
/**
* 自定義xss校驗註解實現
*
* @author ruoyi
*/
public class XssValidator implements ConstraintValidator<Xss, String>
{
private final String HTML_PATTERN = "<(\\S*?)[^>]*>.*?|<.*? />";
@Override
public boolean isValid(String value, ConstraintValidatorContext constraintValidatorContext)
{
return !containsHtml(value);
}
public boolean containsHtml(String value)
{
Pattern pattern = Pattern.compile(HTML_PATTERN);
Matcher matcher = pattern.matcher(value);
return matcher.matches();
}
}
3、實體類使用自定義的@Xss
註解
@Xss(message = "登入賬號不能包含指令碼字元") @NotBlank(message = "登入賬號不能為空") @Size(min = 0, max = 30, message = "登入賬號長度不能超過30個字元") public String getLoginName() { return loginName; }
此時在去儲存會進行驗證,如果不符合規則的字元(例如<script>alert(1);</script>
)會提示登入賬號不能包含指令碼字元
,代表限制成功。