番茄系統(tǒng)家園 - 免費(fèi)重裝系統(tǒng)!簡(jiǎn)單裝系統(tǒng),人人都是裝機(jī)大師!
當(dāng)前位置:首頁(yè)>電腦故障 > 阿粉寫了八千多字,只為講透參數(shù)合法性驗(yàn)證

阿粉寫了八千多字,只為講透參數(shù)合法性驗(yàn)證

來(lái)源:番茄系統(tǒng)家園瀏覽:時(shí)間:2022-04-22 10:56:28

最近很多读者给阿粉留言,说怎么好久没看到我的文章了,这里说一下。

由于公众号不再按时间线排序,所以你会发现有时候能看到几天前的文章,这不是出BUG,是公众号的一次改变。

至于排序的具体标准是啥,阿粉也不太清楚,大概和你打开某个公众号的频率有关。

所以如果你想第一时间收到阿粉的文章,可以点击Java极客技术的的头像,再点右上角三个点,进去设置一下【星标】。

一、介绍

关于参数合法性验证的重要性就不多说了,即使前端对参数做了基本验证以外,后端依然还需要进行验证,以防不合规的数据直接进入后端,严重的甚至会造成系统直接崩溃!

本文结合自己在项目中的实际使用经验,主要以实用为主,对数据合法性验证做一次总结,不了解的朋友可以学习一下,同时可以立马实践到项目上去。

下面我们通过几个示例来演示如何判断参数是否合法,不多说直接开撸!

二、断言验证

对于参数的合法性验证,最初的做法比较简单,自定义一个异常类。

当判断某个参数不合法的时候,直接抛异常!

然后写一个统一异常拦截器,对抛异常的程序进行处理。

这种做法比较直观,如果当前参数既要判断是否为空,又要判断长度是否超过最大长度的时候,代码就显得有点多了!

于是,程序界的大佬想到了一个更加优雅又能节省代码的方式,创建一个断言类工具类,专门用来判断参数的是否合法,如果不合法,就抛异常!

当我们需要对参数进行验证的时候,直接通过这个类就可以完成基本操作,方式如下:

相比上个步骤,当要判断的参数比较多时,代码明显简洁多了!

类似这样的工具类,spring也提供了一个名为Assert的断言工具类,在开发的时候,可以直接使用!

阿粉写了八千多字,只为讲透参数合法性验证

三、注解验证

使用注解对数据进行合法性验证,可以说是 java界一项非常伟大的创新,使用这种方式不仅使的代码变得很简洁,而且阅读起来非常令人赏心悦目!

3.1、依赖包引入

下面我们一起来看看具体的实践方式,以SpringBoot工程为例,如果需要使用注解校验,直接引入spring-boot-starter-web依赖包即可,会自动将注解验证相关的依赖包打入工程!

下面在创建实体类的时候,还会用到lombok插件,因此还需要引入lombok依赖包!

如果是普通的Java工程,引入以下几个依赖包即可!

3.2、注解校验请求对象

紧接着我们来创建一个实体User,用于模拟用户注册时的请求实体对象!

在web层创建一个register()注册接口方法,同时在请求参数上添加@Valid,如下:

最后自定义一个异常全局处理器,用于处理异常消息,如下:

下面我们启动项目,使用postman来测试一把,看看效果如何?

  • 测试字段是否为空

阿粉写了八千多字,只为讲透参数合法性验证

  • 测试邮箱是否合法

阿粉写了八千多字,只为讲透参数合法性验证

  • 测试密码长度是否符合要求

阿粉写了八千多字,只为讲透参数合法性验证

  • 测试密码与确认密码是否相同

阿粉写了八千多字,只为讲透参数合法性验证

3.3、注解校验请求参数

上面我们介绍了请求对象的验证方式,那如果直接在方法上对请求参数进行验证是否同样有效呢?

为了眼见为实,下面我们就来模拟在方法上对请求参数进行验证,看看结果如何。

新建一个查询接口query,如下

使用postman请求试一试,默认给userId参数为null,结果如下:

阿粉写了八千多字,只为讲透参数合法性验证

很清晰的看到,query()方法中的参数注解验证无效!

当我们在UserController类上加上@Validated注解!

使用postman请求再试一试,结果如下!

阿粉写了八千多字,只为讲透参数合法性验证

很清晰的看到,注解进行了验证,同时还抛出异常ConstraintViolationException!

阿粉写了八千多字,只为讲透参数合法性验证

@Validated参数作用于类上时,表示告诉Spring可以对方法中请求参数进行校验!

所有在实际开发的时候,我们可以使用@Validated和@Valid注解的组合来对方法中的请求参数和请求对象进行校验!

同时,@Validated和@Valid注解不仅仅只是验证控制器级别,可以验证任何Spring组件,例如Service层方法入参的验证!

3.4、自定义注解验证

默认的情况下,依赖包已经给我们提供了非常多的校验注解,如下!

  • JSR提供的校验注解!

阿粉写了八千多字,只为讲透参数合法性验证

  • Hibernate Validator提供的校验注解

阿粉写了八千多字,只为讲透参数合法性验证

但是某些情况,例如性别这个参数可能需要我们自己去验证,同时我们也可以自定义一个注解来完成参数的校验,实现方式如下!

  • 新创建一个Sex注解,其中SexValidator类指的是具体的参数验证类

  • SexValidator类,实现自ConstraintValidator接口

最后在User实体类上加入一个性别参数,使用自定义注解进行校验!

使用postman来请求试一试,结果如下!

  • 不传sex参数

阿粉写了八千多字,只为讲透参数合法性验证

很清晰的看到,已经生效!

3.5、手动进行注解校验

某些时候呢,假如有100个类需要用到校验注解,此时我们可能在每个类会加上注解@Validated或者@Valid,再增加100个这样的类,就会造成很多大量的重复工作。

而此时,我们的诉求是想对有校验注解的实体类进行全局参数验证!

解决办法就会用到Validator提供的手动注解校验证工具类,实现方法如下!

  • 新建一个注解验证工具类

使用ValidatorUtils工具类,对参数进行验证

执行之后,结果如下!

当然你还可以对ValidatorUtils类进行改造,当有异常信息的时候,直接抛异常!

同时,你还可以通过@Autowired直接注入的方式来获取Validator对象!

3.6、spring 注解校验原理

如果你对springmvc的方法参数解析器(HandlerMethodArgumentResolver)了解的话,就可能会想到参数校验这块肯定是在对应的方法参数解析器里执行的。

直接定位到resolveArgument这个方法,先通过WebDataBinder进行入参属性绑定,然后再进行校验!

阿粉写了八千多字,只为讲透参数合法性验证

validateIfApplicable方法逻辑,会遍历当前参数methodParam所有的注解,如果注解是@Validated或者注解的名字以Valid开头,则使用WebDataBinder对象执行校验逻辑。

阿粉写了八千多字,只为讲透参数合法性验证

方法参数解析器只针对接口请求时入参进行验证,如果想对任何组件中方法进行注解校验,似乎还缺了点什么!

而当需要对一个类中的方法参数使用注解校验时,在类上加上@Validated就是为了告诉Spring去校验方法参数!

底层核心是通过切面代理类并配合MethodValidationPostProcessor这个后置处理器进行处理!

阿粉写了八千多字,只为讲透参数合法性验证

四、总结

参数验证,在开发中使用非常频繁,如何优雅的进行验证,让代码变得更加可读,是业界大佬一直在追求的目标!

本文主要是对自己在项目中的实际使用到参数验证方式加一整理,希望能帮助到各位网友!

五、参考1、SpringMVC源码

2、JavaGuide - 如何在 Spring/Spring Boot 中做参数校验?[1]

3、胡峻峥 - SpringMvc@Validated注解执行原理[2]

参考资料

[1]JavaGuide - 如何在 Spring/Spring Boot中做参数校验?:https://juejin.im/post/5dc8bc745188254e7a155ba0#heading-14[2]胡峻峥 -SpringMvc@Validated注解执行原理:https://www.cnblogs.com/hujunzheng/p/12570921.html

推薦系統(tǒng)

  • 雨林木風(fēng) winxp下載 純凈版 永久激活 winxp ghost系統(tǒng) sp3 系統(tǒng)下載

    雨林木風(fēng) winxp下載 純凈版 永久激活 winxp ghost系統(tǒng) sp3 系統(tǒng)下載64位
    系統(tǒng)大?。?/em>0MB系統(tǒng)類型:WinXP

    雨林木風(fēng)在系統(tǒng)方面技術(shù)積累雄厚深耕多年,打造了國(guó)內(nèi)重裝系統(tǒng)行業(yè)知名品牌,雨林木風(fēng)WindowsXP其系統(tǒng)口碑得到許多人認(rèn)可,積累了廣大的用戶群體,是一款穩(wěn)定流暢的系統(tǒng),雨林木風(fēng) winxp下載 純凈版 永久激活 winxp ghost系統(tǒng) sp3 系統(tǒng)下載,有需要的朋友速度下載吧。

    系統(tǒng)等級(jí):
    進(jìn)入下載 >
  • 蘿卜家園win7純凈版 ghost系統(tǒng)下載 x64 聯(lián)想電腦專用

    蘿卜家園win7純凈版 ghost系統(tǒng)下載 x64 聯(lián)想電腦專用64位
    系統(tǒng)大?。?/em>0MB系統(tǒng)類型:Win7

    蘿卜家園win7純凈版是款非常純凈的win7系統(tǒng),此版本優(yōu)化更新了大量的驅(qū)動(dòng),幫助用戶們進(jìn)行舒適的使用,更加的適合家庭辦公的使用,方便用戶,有需要的用戶們快來(lái)下載安裝吧。

    系統(tǒng)等級(jí):
    進(jìn)入下載 >
  • 雨林木風(fēng)xp系統(tǒng) xp系統(tǒng)純凈版 winXP ghost xp sp3 純凈版系統(tǒng)下載

    雨林木風(fēng)xp系統(tǒng) xp系統(tǒng)純凈版 winXP ghost xp sp3 純凈版系統(tǒng)下載64位
    系統(tǒng)大?。?/em>1.01GB系統(tǒng)類型:WinXP

    雨林木風(fēng)xp系統(tǒng) xp系統(tǒng)純凈版 winXP ghost xp sp3 純凈版系統(tǒng)下載,雨林木風(fēng)WinXP系統(tǒng)技術(shù)積累雄厚深耕多年,采用了新的系統(tǒng)功能和硬件驅(qū)動(dòng),可以更好的發(fā)揮系統(tǒng)的性能,優(yōu)化了系統(tǒng)、驅(qū)動(dòng)對(duì)硬件的加速,加固了系統(tǒng)安全策略,運(yùn)行環(huán)境安全可靠穩(wěn)定。

    系統(tǒng)等級(jí):
    進(jìn)入下載 >
  • 蘿卜家園win10企業(yè)版 免激活密鑰 激活工具 V2023 X64位系統(tǒng)下載

    蘿卜家園win10企業(yè)版 免激活密鑰 激活工具 V2023 X64位系統(tǒng)下載64位
    系統(tǒng)大?。?/em>0MB系統(tǒng)類型:Win10

    蘿卜家園在系統(tǒng)方面技術(shù)積累雄厚深耕多年,打造了國(guó)內(nèi)重裝系統(tǒng)行業(yè)的蘿卜家園品牌,(win10企業(yè)版,win10 ghost,win10鏡像),蘿卜家園win10企業(yè)版 免激活密鑰 激活工具 ghost鏡像 X64位系統(tǒng)下載,其系統(tǒng)口碑得到許多人認(rèn)可,積累了廣大的用戶群體,蘿卜家園win10純凈版是一款穩(wěn)定流暢的系統(tǒng),一直以來(lái)都以用戶為中心,是由蘿卜家園win10團(tuán)隊(duì)推出的蘿卜家園

    系統(tǒng)等級(jí):
    進(jìn)入下載 >
  • 蘿卜家園windows10游戲版 win10游戲?qū)I(yè)版 V2023 X64位系統(tǒng)下載

    蘿卜家園windows10游戲版 win10游戲?qū)I(yè)版 V2023 X64位系統(tǒng)下載64位
    系統(tǒng)大?。?/em>0MB系統(tǒng)類型:Win10

    蘿卜家園windows10游戲版 win10游戲?qū)I(yè)版 ghost X64位 系統(tǒng)下載,蘿卜家園在系統(tǒng)方面技術(shù)積累雄厚深耕多年,打造了國(guó)內(nèi)重裝系統(tǒng)行業(yè)的蘿卜家園品牌,其系統(tǒng)口碑得到許多人認(rèn)可,積累了廣大的用戶群體,蘿卜家園win10純凈版是一款穩(wěn)定流暢的系統(tǒng),一直以來(lái)都以用戶為中心,是由蘿卜家園win10團(tuán)隊(duì)推出的蘿卜家園win10國(guó)內(nèi)鏡像版,基于國(guó)內(nèi)用戶的習(xí)慣,做

    系統(tǒng)等級(jí):
    進(jìn)入下載 >
  • windows11下載 蘿卜家園win11專業(yè)版 X64位 V2023官網(wǎng)下載

    windows11下載 蘿卜家園win11專業(yè)版 X64位 V2023官網(wǎng)下載64位
    系統(tǒng)大?。?/em>0MB系統(tǒng)類型:Win11

    蘿卜家園在系統(tǒng)方面技術(shù)積累雄厚深耕多年,windows11下載 蘿卜家園win11專業(yè)版 X64位 官網(wǎng)正式版可以更好的發(fā)揮系統(tǒng)的性能,優(yōu)化了系統(tǒng)、驅(qū)動(dòng)對(duì)硬件的加速,使得軟件在WINDOWS11系統(tǒng)中運(yùn)行得更加流暢,加固了系統(tǒng)安全策略,WINDOWS11系統(tǒng)在家用辦公上跑分表現(xiàn)都是非常優(yōu)秀,完美的兼容各種硬件和軟件,運(yùn)行環(huán)境安全可靠穩(wěn)定。

    系統(tǒng)等級(jí):
    進(jìn)入下載 >

熱門系統(tǒng)