课堂课题:
什么是参数校验,前端和后端需要分别做校验吗?Validation的好处和坏处分别是什么,在真实项目中需要使用Validation吗?
关联任务:
任务五
直播时间:
2018-11-22 18:30: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)结束语:
今天的分享就到这里啦,欢迎大家点赞、转发、留言、拍砖~
【修真院java 小课堂】 Validation 参数校验
大家好,我是IT修真院郑州分院第12期的学员张泉良,一枚正直纯洁善良的JAVA程序员,今天给大家分享一下,
修真院官网JAVA任务二,深度思考中的知识点——Validation 参数校验
1. 背景介绍:
参数验证是一个常见的问题,无论是前端还是后台,都需对用户输入进行验证,以此来保证系统数据的正确性。
对于web来说,有些人可能理所当然的想在前端验证就行了,但这样是非常错误的做法,前端代码对于用户来说是透明的,
稍微有点技术的人就可以绕过这个验证,直接提交数据到后台。参数验证随处可见,也是必不可少的。
前端做验证只是为了用户体验,后端才是最终的保障。
2. 知识剖析:
(1) 常见的参数检验方式:
a、表现层验证:SpringMVC提供对JSR-303的表现层验证,或者直接将拿到的参数在controller层里面用if判断
b、业务逻辑层验证:Spring3.1提供对业务逻辑层的方法验证
c、DAO层验证:Hibernate提供DAO层的模型数据的验证
d、数据库端的验证:通过数据库约束来进行
原理都是基于javax validation,有特殊需求的话,可以自定义校验
(2) JSR 303
JSR 303(Java Specification Requests 规范提案)是JAVA EE 6中的一项子规范,
一套JavaBean参数校验的标准,叫做Bean Validation。
JSR 303用于对Java Bean中的字段的值进行验证,Spring MVC 3.x之后之中也大力支持 JSR303
JSR303提供的校验注解---------可以注解在javabean的field和properties上,也可以注解在map、list上,注解很灵活
@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=) 被注释的元素必须符合指定的正则表达式
(3) Hibernate Validator
Hibernate Validator是JSR-303的一个参考实现,它除了支持所有标准的校验注解外,还支持如下扩展注解
@Email 被注解的元素必须是电子邮箱地址
@Length(min=,max=) 被注解的字符串的大小必须在指定的范围内
@NotBlank 验证字符串非null,且长度必须大于0
@NotEmpty 被注释的字符串的必须非空
@Range(min=,max=) 被注解的元素必须在合适的范围内
(4) Spring校验框架
Spring的org.springframework.validation是校验框架所在的包。LocalValidatorFactoryBean既实现了
Spring的Validator接口,又实现了JSR-303的Validator接口。只要在Spring容器中定义一个LocalValidatorFactoryBean
即可将其注入需要数据校验的Bean中。
3. 常见问题:
(1) SpringValidation和javax validation的区别
JSR303是一项标准,他们规定一些校验规范即校验注解,位于javax.validation.constraints包下,.只提供规范不提供实现
Hibernate validation,他提供了相应的实现,并增加了一些其他校验注解
spring validation其在springmvc模块中添加了自动校验,并将校验信息封装进了特定的类中
(2) 参数校验的基本使用
多个属性的校验
在日志或者控制台输出校验的信息
部分注解仅能用于部分数据类型
如@notblank注解仅用于字符串,使用时需注意
(3) 自定义消息错误消息
Spring中定义了一个MessageSource接口,以用于支持信息的国际化和包含参数的信息的替换。
ApplicationContext接口继承了MessageSource接口,
所以所有的ApplicationContext实现类都实现了MessageSource接口。
也就是我们我们可以通过ApplicationContext来调用MessageSource接口方法以实现信息的国际化和替换信息中包含的参 数。
<mvc:annotation-driven validator="validator" />
<bean id="validator" class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean" >
<property name="providerClass" value="org.hibernate.validator.HibernateValidator" />
<!-- 如果不加默认到 使用classpath下的 ValidationMessages.properties -->
<property name="validationMessageSource" ref="messageSource" />
</bean>
<bean id="messageSource" class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
<property name="basenames" value="classpath:messages" />
<property name="defaultEncoding" value="UTF-8"/>
<property name="cacheSeconds" value="60"/>
</bean>
4. 编码实战:
5. 拓展思考:
(1)分组校验
分组简单说: 解决实体中每个属性都是设置了参数检验,但是在某个方法内只想检验部分属性任务,也可以叫分类,
采用接口的方式来标识,可以类比java集合中的序列化接口 (Serializable)
比如说有 用户名,密码,手机号,邮箱,年龄,性别,我想要检验其中的任意2个属性(假设为手机号,年龄),
当然可以直接加入对应的注解,如果换成手机号和密码,肯定又要写2个注解,
当字段过多,并且使用场景频繁时,分组是个不错的选择
假设有2个分组 interface Group1,interface Group2
@NotNull(message = "姓名不能为空",groups = {Group1.class})
private String name;
指定分组后,使用@Validated(Group1.class) Student student,只检验指定分组
(2)自定义校验
这个不建议进行,现有的检验类型基本够,如果有更多要求,建议使用逻辑判断,这样更清晰,记录日志方便,出现问题可以及时排查。
6. 参考文献:
https://blog.csdn.net/xu1916659422/article/details/77430924
https://blog.csdn.net/u013815546/article/details/77248003
7. 更多讨论:
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功能拦截异常,给出自定义的错误信息
8. 鸣谢:
9. 结束语:
今天的分享就到这里啦,欢迎大家点赞、转发、留言、拍砖~
[郑州|结业弟子]JAVA-何爽 发表于 2018-11-25 11:30:59 #1
参数校验这个东西还是比较重要的,复盘的时候也会用到的。
回复