IT修真院·小课堂丨互联网职业小课堂在线学习平台

课堂课题:

什么是参数校验,前端和后端需要分别做校验吗?Validation的好处和坏处分别是什么,在真实项目中需要使用Validation吗?

关联任务:

任务五

直播时间:

2019-06-13 15:00:00


课堂内容:

视频链接:

PPT链接:

提交按钮:

小课堂内容格式


标题:

【修真院xx(职业)小课堂】课题名称

开场语:

大家好,我是IT修真院XX分院第X期的学员XX,一枚正直纯洁善良的XX程序员,今天给大家分享一下,修真院官网XX(职业)任务X,深度思考中的知识点——XXX

(1)背景介绍:

背景介绍的时候,尽可能的要宽广,讲清楚来龙去脉,讲清楚为什么会需要这个技术。

(2)知识剖析:

讲知识点的时候,尽可能的成体系,学会成体系的去给别人介绍知识。现在很多做的都是零散的,没有分类。

(3)常见问题:

最少列出1个常见问题。

(4)解决方案:

写清楚常见问题的解决方案。

(5)编码实战:

尽可能的去寻找在真实项目中在用的。如果你能找到某个网站在用你说的知识点,这是最好的。学以致用,否则当成练习题就没有意义了。多准备一些demo,讲解过程中将知识点和demo结合,便于大家理解所讲解的知识点。

(6)拓展思考:

知识点之外的拓展思考,由分享人进行讲解,这些东西就是所谓的深度,也是一个人技术水准高低比较的表现。

(7)参考文献:

引入参加文献的时候,在引用的句子后面加上序号【1】。参考文献中列出详细来源。不要去抄别人的东西,这是一个基本的态度。

(8)更多讨论:

Q1:提问人:问题?
A1:回答人(可以是分享人,也可以是其他学员):回答
Q2:提问人:问题?
A2:回答人(可以是分享人,也可以是其他学员):回答
Q3:提问人:问题?
A3:回答人(可以是分享人,也可以是其他学员):回答

(9)鸣谢:

感谢XX、XX师兄,此教程是在他们之前技术分享的基础上完善而成。

(10)结束语:

今天的分享就到这里啦,欢迎大家点赞、转发、留言、拍砖~

什么是参数校验,前端和后端需要分别做校验吗?Validation的好处和坏处分别是什么,在真实项目中需要使用Validation吗?    

辅导师兄 [真传弟子]JAVA-李绍博


【修真院java小课堂】什么是参数校验,前端和后端需要分别做校验吗?Validation的好处和坏处分别是什么,在真实项目中需要使用Validation吗?


  大家好,我是IT修真院成都分院第16期的学员何佳欢,一枚正直纯洁善良的java程序员,今天给大家分享一下,修真院官网java(职业)任务三,深度思考中的知识点——

什么是参数校验,前端和后端需要分别做校验吗?Validation的好处和坏处分别是什么,在真实项目中需要使用Validation吗?


(1)背景介绍:

参数验证的必要性:“客户端传来的参数都是不可信的”我就是说是行业的一种说法;“后端进行参数校验,是防止别人通过接口乱刷服务”。

绕过js验证的常用方法

将页面保存到自己机器上,然后把脚本检查的地方去掉,最后在自己机器上运行那个页面就可以了.将引入js的语句删掉,或则将引入的js后缀名更换成任意的名字,在浏览器地址栏中直接输入请求URL及参数,发送get请求,就可以了,postman直接发送请求,如果服务端不验证,那么完全可以在任何连接互联网的地方重写一个没有JS验证的表单,然后提交给你网站的程序,后果可想而知,几乎就是自由出入这就是为什么我们需要做服务端参数校验

(2)知识剖析:

参数校验的方式:表现层验证:SpringMVC提供对JSR-303的表现层验证;业务逻辑层验证:Spring3.1提供对业务逻辑层的方法验证;DAO层验证:Hibernate提供DAO层的模型数据的验证;数据库端的验证:通过数据库约束来进行;JSR-303也提供编程式验证支持

通过 if-if :逐个对参数进行验证,这种方式最粗暴.如果参数一多,就要写n多的if-if,相当繁琐,更重要的是这部分判断没法重用,另一个方法又是这样判断。

自定义注解实现参数校验:切面拦截controller方法,然后捕获带@CheckParam注解方法参数实例,最后反射实例校验。

自定义ValidationUtils:表单验证工具类ValidationUtils,依赖包commons-lang

JSR-303(Java Specification Requests 规范提案)是JAVA EE 6中的一项子规范,一套JavaBean参数校验的标准,叫做Bean Validation。JSR-303用于对JavaBean中的字段的值进行验证,Spring MVC3.x之中也大力支持JSR-303,可以在控制器中对表单提交的数据方便地验证。

(3)常见问题:

参数类型



(4)解决方案:

JSR提供的校验注解:

@Null 被注释的元素必须为 null 

@NotNull 被注释的元素必须不为 null 

@AssertTrue 被注释的元素必须为 true 

@AssertFalse 被注释的元素必须为 false 

@Min(value) 被注释的元素必须是一个数字,其值必须大于等于指定的最小值 

@Max(value) 被注释的元素必须是一个数字,其值必须小于等于指定的最大值 

@DecimalMin(value) 被注释的元素必须是一个数字,其值必须大于等于指定的最小值 

@DecimalMax(value) 被注释的元素必须是一个数字,其值必须小于等于指定的最大值 

@Size(max=, min=) 被注释的元素的大小必须在指定的范围内 

@Digits (integer, fraction) 被注释的元素必须是一个数字,其值必须在可接受的范围内 

@Past 被注释的元素必须是一个过去的日期 

@Future 被注释的元素必须是一个将来的日期 

@Pattern(regex=,flag=) 被注释的元素必须符合指定的正则表达式

Hibernate Validator提供的校验注解:

@NotBlank(message =) 验证字符串非null,且长度必须大于0 

@Email 被注释的元素必须是电子邮箱地址 

@Length(min=,max=) 被注释的字符串的大小必须在指定的范围内 

@NotEmpty 被注释的字符串的必须非空 

@Range(min=,max=,message=) 被注释的元素必须在合适的范围内

(5)编码实战:


(6)拓展思考:

JSR和Hibernate validator的校验只能对Object的属性进行校验

spring 在此基础上进行了扩展,添加了MethodValidationPostProcessor拦截器,可以实现对方法参数的校验

同一Model增加修改的参数不一样

Spring validator 方法级别的校验

JSR和Hibernate validator的校验只能对Object的属性进行校验,不能对单个的参数进行校验,spring 在此基础上进行了扩展,添加了MethodValidationPostProcessor拦截器,可以实现对方法参数的校验


public @NotNull UserModel get2(@NotNull @Size(min = 1) Integer uuid) {  

    //获取 User Model  

    UserModel user = new UserModel(); //此处应该从数据库获取  

    return user;  

}  

分组校验

定义两个空接口,分别代表Person对象的增加校验规则和修改校验规则


//可以在一个Model上面添加多套参数验证规则,此接口定义添加Person模型修改时的参数校验规则


public interface PersonAddView {}


public interface PersonModifyView {}

Model上添加注解时使用指明所述的分组


public class Person {

   private long id;

   /**

    * 添加groups 属性,说明只在特定的验证规则里面起作用,不加则表示在使用Deafault规则时起作用

    */


   @NotNull(groups = {PersonAddView.class, PersonModifyView.class}, message= "添加、修改用户时名字不能为空",payload = ValidateErrorLevel.Info.class)


   @ListNotHasNull.List({

           @ListNotHasNull(groups = {PersonAddView.class}, message = "添加上Name不能为空"),

           @ListNotHasNull(groups = {PersonModifyView.class}, message = "修改时Name不能为空")})

   private String name;


   @NotNull(groups = {PersonAddView.class}, message = "添加用户时地址不能为空")

   private String address;


   @Min(value = 18, groups = {PersonAddView.class}, message = "姓名不能低于18岁")

   @Max(value = 30, groups = {PersonModifyView.class}, message = "姓名不能超过30岁")

   private int age;

 //getter setter 方法......


}


(7)参考文献:

【1】https://blog.csdn.net/m0_37499059/article/details/81431562

【2】https://blog.csdn.net/wangpeng047/article/details/41722133

(8)更多讨论:

Q1:表单提交时,不填该表的内容,正常submit,默认为空字符串 "",怎么解决


A1:在前端验证是否为空,后端使用isEmpty方法或者@NotEmpty注解


Q2: 为什么会出现 HV000030: No validator could be found for type: java.lang.Integer.


A2: 可能在Integer属性上加了不属于整型的校验,比如@NotEmpty,@Length等


Q3:数值性参数: 当输入为空时,字符串"",解析失败之后不能再进行其他判断,会出现NPE


A3:可以考虑使用自定义异常,使用Spring Aop功能拦截异常,给出自定义的错误信息

(9)鸣谢:

感谢绍博师兄,赵君钊师兄此教程是在他们之前技术分享的基础上完善而成。

(10)结束语:

今天的分享就到这里啦,欢迎大家点赞、转发、留言、拍砖~

评论

请您登录 后进行评论