前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >合理的实现输入校验

合理的实现输入校验

作者头像
CodeWwang
发布2022-08-24 10:17:28
6800
发布2022-08-24 10:17:28
举报
文章被收录于专栏:CodeWwang

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

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

代码语言: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
复制
 <dependency> 
 <groupId>org.springframework.boot</groupId> 
 <artifactId>spring-boot-starter-validation</artifactId> 
 </dependency> 

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

如果你希望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); 
 } 

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

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020/12/28 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档