在实际开发时候,或多或少都会对输入的参数进行校验,比如邮箱、手机号、身份证号等。为了提升程序的健壮性,这些校验也是必须的。
传统的校验方式,也是非常稳妥的方式,使用工具类自定义正规则来输入参数。下面是常用的正规则校验工具类,仅供参考。
/**
* @author WangWei
* @date 2020/9/13
*/
public class ValidateUtil {
/**
* 正则表达式:验证用户名
*/
public static final String REGEX_USERNAME = "^[a-zA-Z]\\w{5,20}$";
/**
* 正则表达式:验证密码
*/
public static final String REGEX_PASSWORD = "^[a-zA-Z0-9]{6,20}$";
/**
* 正则表达式:验证手机号
*/
public static final String REGEX_MOBILE = "^((17[0-9])|(14[0-9])|(13[0-9])|(15[^4,\\D])|(18[0,5-9]))\\d{8}$";
/**
* 正则表达式:验证邮箱
*/
public static final String REGEX_EMAIL = "^([a-z0-9A-Z]+[-|\\.]?)+[a-z0-9A-Z]@([a-z0-9A-Z]+(-[a-z0-9A-Z]+)?\\.)+[a-zA-Z]{2,}$";
/**
* 正则表达式:验证汉字
*/
public static final String REGEX_CHINESE = "^[\u4e00-\u9fa5],{0,}$";
/**
* 正则表达式:验证身份证
*/
public static final String REGEX_ID_CARD = "(^\\d{18}$)|(^\\d{15}$)";
/**
* 正则表达式:验证URL
*/
public static final String REGEX_URL = "http(s)?://([\\w-]+\\.)+[\\w-]+(/[\\w- ./?%&=]*)?";
/**
* 正则表达式:验证IP地址
*/
public static final String REGEX_IP_ADDR = "(25[0-5]|2[0-4]\\d|[0-1]\\d{2}|[1-9]?\\d)";
/**
* 校验用户名
*
* @param username
* @return 校验通过返回true,否则返回false
*/
public static boolean isUsername(String username) {
return Pattern.matches(REGEX_USERNAME, username);
}
/**
* 校验密码
*
* @param password
* @return 校验通过返回true,否则返回false
*/
public static boolean isPassword(String password) {
return Pattern.matches(REGEX_PASSWORD, password);
}
/**
* 校验手机号
*
* @param mobile
* @return 校验通过返回true,否则返回false
*/
public static boolean isMobile(String mobile) {
return Pattern.matches(REGEX_MOBILE, mobile);
}
/**
* 校验邮箱
*
* @param email
* @return 校验通过返回true,否则返回false
*/
public static boolean isEmail(String email) {
return Pattern.matches(REGEX_EMAIL, email);
}
/**
* 校验汉字
*
* @param chinese
* @return 校验通过返回true,否则返回false
*/
public static boolean isChinese(String chinese) {
return Pattern.matches(REGEX_CHINESE, chinese);
}
/**
* 校验身份证
*
* @param idCard
* @return 校验通过返回true,否则返回false
*/
public static boolean isIDCard(String idCard) {
return Pattern.matches(REGEX_ID_CARD, idCard);
}
/**
* 校验URL
*
* @param url
* @return 校验通过返回true,否则返回false
*/
public static boolean isUrl(String url) {
return Pattern.matches(REGEX_URL, url);
}
/**
* 校验IP地址
*
* @param ipAddr
* @return
*/
public static boolean isIPAddr(String ipAddr) {
return Pattern.matches(REGEX_IP_ADDR, ipAddr);
}
}
如何使用呢?比如想校验用户名是否满足5到20位数字和字母组合要求,只需要调用如下代码:
if(!ValidateUtil.isPassword(user.getPassword())){
return ResponseResult.FAILED(GlobalTipMsg.INCORRECT_PASSWORD_FORMAT);
}
为了代码的简洁和避免重复造轮子,我们也可以用第三方校验框架,以比较常用的validation
作为框架实现校验,下面开始实操:
如果你是Maven项目,需要导入对应的依赖,这里以SpringBoot项目为例,在pom.xml引入以下依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
</dependency>
下面在实体类上添加框架提供的注解:
如果你希望email不为空,添加@NotBlank注解,message是希望返回的提示信息。
@NotBlank(message = GlobalTipMsg.EMAIL_NOT_NULL)
@Column(name = "email")
下面列举一些常用的输入校验注解,比较详细的介绍可以去Spring官网查看。
@NotBlank 检验字符串参数不能为空
@NotNull 校验参数不能为null
@Null 校验参数为null
@NotEmpty 字符串不能为空,集合不能为空
@Size(min = 1,max = 20) 检验集合元素的个数是否满足要求
@Email 检验参数是否是邮箱格式
@Pattern(regexp = “a{0,1}”) 使用正则表达式校验字符串
@CreditCardNumber() 是否是美国的信用卡号
@Length(min = 1,max = 100) 校验字符串的长度是否满足要求
@Range(min = 1,max = 2) 校验数字的值
@SafeHtml 校验字符串是否是安全的html
@URL 校验url是否是合法的url
@AssertFalse 校验值是否是false
@AssertTrue 校验值是否是true
@DecimalMax(value = “1.00”,inclusive = true) 校验数字或者是字符串是否小于等于某个值,inclusive为false的时候为小于
@DecimalMin(value = “2.00”,inclusive = false) 校验数字或者是字符串是否大于等于某个值,inclusive为false的时候为大于
@Digits(integer = 1,fraction = 2) 校验数字的格式 integer指定整数部分的长度 fraction指定小数部分的长度
@Past 日期必须是过去的日期
@Future 日期必须是未来的日期
@Max(value = 1) 小于等于,不能注解在字符串上
@Min(2) 大于等于,不能注解在字符串上
@JsonFormat、@DateTimeForma 时间格式校验
最为核心的一步,在需要校验的接口出添加V alid
的注解,表明该控制器对传的参数先拦截校验,校验无误后方可进入接口内部,如下:
@ApiOperation(value = "注册")
@PostMapping(value = "/register")
public ResponseResult regiser(HttpServletRequest request,
@Valid @RequestBody User user ,
@RequestParam("verifyCode")String verifyCode,
@RequestParam("captcha")String captchaCode,
@RequestParam("captcha_key")String captchaKey){
return userService.register(request,user,verifyCode,captchaCode,captchaKey);
}
通过以上步骤,基于框架的输入校验大功告成。