合理的实现输入校验

合理的实现输入校验

在实际开发时候,或多或少都会对输入的参数进行校验,比如邮箱、手机号、身份证号等。为了提升程序的健壮性,这些校验也是必须的。

传统的校验方式,也是非常稳妥的方式,使用工具类自定义正规则来输入参数。下面是常用的正规则校验工具类,仅供参考。

代码语言:javascript复制/**

* @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位数字和字母组合要求,只需要调用如下代码:

代码语言:javascript复制 if(!ValidateUtil.isPassword(user.getPassword())){

return ResponseResult.FAILED(GlobalTipMsg.INCORRECT_PASSWORD_FORMAT);

}

为了代码的简洁和避免重复造轮子,我们也可以用第三方校验框架,以比较常用的validation作为框架实现校验,下面开始实操:

如果你是Maven项目,需要导入对应的依赖,这里以SpringBoot项目为例,在pom.xml引入以下依赖:

代码语言:javascript复制

org.springframework.boot

spring-boot-starter-validation

下面在实体类上添加框架提供的注解:

如果你希望email不为空,添加@NotBlank注解,message是希望返回的提示信息。

代码语言:javascript复制 @NotBlank(message = GlobalTipMsg.EMAIL_NOT_NULL)

@Column(name = "email")

下面列举一些常用的输入校验注解,比较详细的介绍可以去Spring官网查看。

代码语言:javascript复制@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的注解,表明该控制器对传的参数先拦截校验,校验无误后方可进入接口内部,如下:

代码语言:javascript复制 @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);

}

通过以上步骤,基于框架的输入校验大功告成。

相关文章