参数验证
spring boot
中可以用@Validated
来校验数据,如果数据异常则会统一抛出异常,方便异常中心统一处理。
1.注解参数说明
注解名称 | 功能 |
---|---|
@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 |
2.数据校验使用
1、基础使用 因为spring boot
已经引入了基础包,所以直接使用就可以了。首先在controller
上声明@Validated
需要对数据进行校验。
public AjaxResult add(@Validated @RequestBody SysUser user)
{
.....
}
2、然后在对应字段Get方法
加上参数校验注解,如果不符合验证要求,则会以message
的信息为准,返回给前端。
@Size(min = 0, max = 30, message = "用户昵称长度不能超过30个字符")
public String getNickName()
{
return nickName;
}
@NotBlank(message = "用户账号不能为空")
@Size(min = 0, max = 30, message = "用户账号长度不能超过30个字符")
public String getUserName()
{
return userName;
}
@Email(message = "邮箱格式不正确")
@Size(min = 0, max = 50, message = "邮箱长度不能超过50个字符")
public String getEmail()
{
return email;
}
@Size(min = 0, max = 11, message = "手机号码长度不能超过11个字符")
public String getPhonenumber()
{
return phonenumber;
}
也可以直接放在字段上面声明。
@Size(min = 0, max = 30, message = "用户昵称长度不能超过30个字符")
private String nickName;
3.自定义注解校验
使用原生的@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>
)会提示登录账号不能包含脚本字符
,代表限制成功。
如果是在方法里面校验整个实体,参考示例。
@Autowired
protected Validator validator;
public void importUser(SysUser user)
{
BeanValidators.validateWithException(validator, user);
}
4.自定义分组校验
有时候我们为了在使用实体类的情况下更好的区分出新增、修改和其他操作验证的不同,可以通过groups
属性设置。使用方式如下
新增类接口,用于标识出不同的操作类型
public interface Add
{
}
public interface Edit
{
}
Controller.java
// 新增
public AjaxResult addSave(@Validated(Add.class) @RequestBody Xxxx xxxx)
{
return success(xxxx);
}
// 编辑
public AjaxResult editSave(@Validated(Edit.class) @RequestBody Xxxx xxxx)
{
return success(xxxx);
}
Model.java
// 仅在新增时验证
@NotNull(message = "不能为空", groups = {Add.class})
private String xxxx;
// 在新增和修改时验证
@NotBlank(message = "不能为空", groups = {Add.class, Edit.class})
private String xxxx;
提示
如果你有更多操作类型,也可以自定义类统一管理,使用方式就变成了
Type.Add
、Type.Edit
、Type.Xxxx
等。
package com.eva.core.constants;
/**
* 操作类型
*/
public interface Type
{
interface Add {}
interface Edit {}
interface Xxxx {}
}