在实验业务时,特别是在登录时,可能需要验证前端传送过来的帐号密码是否符合要求:例如假如帐号是手机号,我们需要验证手机号是否合法(长度是否是11位,等等),此外,如果前端传送的是对象,在后端接收时需要验证重要字段是否符合要求。
为什么有些可以在前端可以验证的,后端还要验证?
后端可以说是最后一道防线,所以不管前端时候进行了验证,后端在数据入库之前都要进行验证,这是出于安全的考虑。
今年天的主角:validation
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
</dependency>
添加完注解之后,我们可以在controller参数接收时进行对象验证,下面举例说明
例如我们在logincontroller中定义了一个login方法:
public RespBean doLogin(LoginVo loginVo){
// log.info("{}",loginVo);
RespBean respBean = iUserService.doLogin(loginVo);
return respBean;
}
loginVo为vo类,接受前端传来的用户名和密码,传统上我们验证用户和密码是否有效应该在service蹭,即在iUserService里面进行验证:
String mobile = loginVo.getMobile();
String password = loginVo.getPassword();
if (StringUtils.isEmpty(mobile)||StringUtils.isEmpty(password)){
return RespBean.error(RespBeanEnum.LOGIN_ERROR);
}
if(!ValidatorUtil.isMobile(mobile)){
return RespBean.error(RespBeanEnum.MOBILE_ERROR);
}
验证逻辑大致如上,进行非空验证,还有这里用户名是手机号,那么我们还需要:“ValidatorUtil.isMobile(mobile)来验证是否符合手机号规则:1开头,等等,ValidatorUtil.isMobile()实现如下:
private static final Pattern mobile_pattern = Pattern.compile("[1][3-9][0-9]{9}$");
public static boolean isMobile(String mobile){
if (StringUtils.isEmpty(mobile)){
return false;
}
Matcher matcher = mobile_pattern.matcher(mobile);
return matcher.matches();
}
经过这么复杂的定义才完成对输入参数的验证,现在我们导入validation依赖后,可以通过在controller方法中添加@Valid关键字进行检查
public RespBean doLogin(@Valid LoginVo loginVo){
// log.info("{}",loginVo);
RespBean respBean = iUserService.doLogin(loginVo);
return respBean;
}
标注@Valid之后,便会对LoginVo对象进行检查,需要检查哪些,可以在LoginVo对象中进行配置:
@Data
public class LoginVo {
@NotNull//非空
@IsMobile//自定义注解,检查手机号位数和有效性
private String mobile;
@NotNull
@Length(min = 32)//设置密码长度检验,最小32为(md5加密之后)
private String password;
}
关于自定义模板下次介绍