第五讲 数据校验.ppt_第1页
第五讲 数据校验.ppt_第2页
第五讲 数据校验.ppt_第3页
第五讲 数据校验.ppt_第4页
第五讲 数据校验.ppt_第5页
已阅读5页,还剩46页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、Struts2 输入验证,本次课的主要内容,输入校验,3,4,2.,本章主要内容,简介 用validate方法进行输入校验 validate()方法输入校验、validateXxx()方法输入校验 基于框架的输入校验 使用字段校验的输入校验、使用非字段校验的输入校验,简介,Web技术的发展给用户带来了方便,使用浏览器就可以完成某些工作。在方便使用的同时,也将系统输入界面暴露给用户,面临大量恶意破坏性输入的考验。例如金额的输入框中输入字母汉字,日期的输入框输入不正确的格式或不可能存在的日期等。这些都需要我们通过输入校验来解决。输入校验直接影响了系统的抗破坏性能和稳定性。 实际上,输入校验往往同类

2、型转换联系在一起,都是对用户输入数据的规范化检查和处理,我们可以通过JavaScript来实现客户端校验,但一般都只是完成初步的检查和过滤,但对于需要与服务器交互的逻辑性校验就无能为力了,虽然提高了相应速度,但是功能有很大局限性,代码维护性也不好。我们不来讲解JavaScript的客户端校验,只是来看看Struts2为我们提供的输入校验方法。,Struts 2输入校验,输入校验分为客户端校验和服务器端校验。 客户端校验可以过滤掉用户的错误操作,是第一道防线,一般使用JavaScript代码实现。仅有客户端验证还是不够的。攻击者还可以绕过客户端校验直接进行非法输入,这样可能会引起系统的异常,所以

3、必须加上服务器端的验证。但仅有服务器端验证也是不行的,客户的错误操作总是提交到服务器,由服务器端进行验证返回错误信息,这样会加重服务器的负担。 所以客户端验证和服务器端验证缺一不可,两者结合起来才可以构建健壮的系统。,什么是输入校验,输入校验,从字面上来看好像是指对如输入的密码或者用户名输入错误的校验。其实这个不算输入校验,这个算是业务逻辑的判断了。输入校验是对输入的用户名长度、密码长度、年龄信息等的判断。为了给大家一个感官上的认识,现在打开163邮箱的注册页面,如图所示。,为什么要进行输入校验,那为什么要进行输入校验呢?使用它有什么好处呢?为了更好地说明,来看下面这个注册页面,如图所示。 现

4、在按常规输入用户注册信息,单击“注册”按钮进行注册。页面跳转到注册信息显示页,如图所示。,输入校验,Struts2的输入校验步骤,对请求参数执行类型转换,转换是否出错,将错误提示保存到ActionContext,内建验证器进行验证,conversionError负责将其转换成fieldError,执行validateXxx()方法,执行validate()方法,包含fieldError吗,调用Action的处理方法,呈现视图资源,是,否,是,跳过Action处理逻辑,返回input视图,否,输入校验,手动完成输入校验 重写validate()方法 继承ActionSupport类,重写vali

5、date()方法 实例:OverrideValidate 重写validateXxx()方法 对于多个处理逻辑的校验,会有多个validateXxx()方法,重写这多个方法,可以实现对不同处理逻辑的独立校验处理。 实例:ValidateXxx,手工编写代码实现输入校验,通过重写validate()或validateXxx()方法实现, validate()方法会校验action中所有与execute方法签名相同的方法。 validateXxx()只会校验action中方法名为Xxx的方法。其中Xxx的第一个字母要大写。当某个数据校验失败时,我们应该调用addFieldError()方法往系统的

6、fieldErrors添加校验失败信息(为了使用addFieldError()方法,action可以继承ActionSupport ),如果系统的fieldErrors包含失败信息,struts2会将请求转发到名为input的result。在input视图中可以通过显示失败信息。 validate()使用例子: Override public void validate() if(username=null 验证失败后,请求转发至input视图: /WEB-INF/page/addUser.jsp 在addUser.jsp页面中使用显示失败信息。,输入校验的流程,1。类型转换器对请求参数执行类

7、型转换,并把转换后的值赋给action中的属性。 2。如果在执行类型转换的过程中出现异常,系统会将异常信息保存到ActionContext,conversionError拦截器将异常信息封装到fieldErrors里,然后执行第3步。如果类型转换没有出现异常,则直接进入第3步。 3。系统通过反射技术调用action中的validateXxx()方法,Xxx为方法名。 4。调用action中的validate()方法。 5。经过上面4步,如果系统中的fieldErrors存在错误信息(即存放错误信息的集合的size大于0),系统自动将请求转发至名称为input的视图。如果系统中的fieldErr

8、ors没有任何错误信息,系统将执行action中的处理方法。,用validate方法进行输入校验,1 validate()方法输入校验 我们先来学习validate()方法进行校验。创建“com.ntc.sample.sshvalidate”的package包。并在其下边建立ValidateAction类,关键代码如下所示。校验逻辑如代码注释,对于用户名,必须输入,对于密码必须长度在6-10。,注意:使用validate()方法必须继承ActionSupport类,用validate方法进行输入校验,validate()方法输入校验 接着创建validate.jsp,用来输入用户名和密码。代码

9、如下所示,,用validate方法进行输入校验,.1 validate()方法输入校验 然后创建校验成功后的页面detail.jsp,代码如下所示。,用validate方法进行输入校验,.1 validate()方法输入校验 在src目录下建立配置文件struts.xml,如下所示。,用validate方法进行输入校验,.1 validate()方法输入校验 初始化的页面如下图所示 。,用validate方法进行输入校验,.1 validate()方法输入校验 点击确认后,我们的校验执行了,这里,每个输入域都会出现对应的错误信息,效果图如下。,用validate方法进行输入校验,.1 vali

10、date()方法输入校验 当我们输入符合条件的数据但不是admin和password时,例如输入admi和1234567时,返回输入页面但是没有出错信息,说明校验是正常通过的只是逻辑不正确。,用validate方法进行输入校验,.1 validate()方法输入校验 我们再来输入admin和password,将迁移到detail.jsp,表示校验正常,逻辑也正确。,用validate方法进行输入校验,.1 validate()方法输入校验 我们还可以在validate.jsp中加入如下代码,这样可以把所有的异常信息显示出来。 我们把它放在了上边,出错的时候,错误信息除了在每个输入框处显示外,在

11、页面最下端也会把所有的错误显示出来。 效果图。,用validate方法进行输入校验,.2 validateXxx()方法输入校验 对于使用validate()方法校验,我们在Action中所有的处理方法都会进行数据校验,可以把所有要验证的逻辑代码都写入其中,但是却不利于维护,而validateXXX可以将某逻辑的校验代码从validate分离出来。 validateXxx()方法则是对不同的业务方法进行数据校验。 例如,我们有一个login()方法,我们使用validateLogin()方法来处理数据输入校验。 我们来看一个例子里面的ValidateXxxAction类,里边定义一个login

12、方法,并建立validateLogin方法 注意:由于validate()方法对Action类中所有方法进行校验,所以,在使用validateXxx()方式时,最好去掉validate()方法的代码,或者检查两者不需要重复校验。,用validate方法进行输入校验,.2 validateXxx()方法输入校验 以下是校验类的校验方法的主要代码。,注意:使用validateXxx()方法必须继承ActionSupport类,用validate方法进行输入校验,.2 validateXxx()方法输入校验 我们再来看validatexxx.jsp,只是form的action改成了validatex

13、xx,其他的也没有变化,主要代码如下。,用validate方法进行输入校验,.2 validateXxx()方法输入校验 Struts.xml关键代码如下。,当validate()和validateXXX都存在时,validateXXX方法校验得到的错误信息先显示出来,然后才是validate方法校验的字段错误信息 validate方法在validateXXX方法被调用后,依然会被调用 错误信息均保留在ArrayList中,谁先运行,谁的结果就排在前面,Struts的输入校验流程,客户端提交数据后,Struts2进行类型转换 类型转换成功后,调用validateXXX方法 调用完validat

14、eXXX方法后,继续调用validate方法 如果没有字段错误,则调用Action处理方法;有错误,则返回input Action处理结束后,返回结果,转入相应的web页,基于框架的输入校验,我们上节用validate()和validateXxx()方法进行了校验,这种方式的校验的弊端就是写在了Action实现类中,使Action变得复杂臃肿,同时提高了Action同输入校验之间的耦合度。 Struts2框架提供了一种基于框架文件的输入校验方式,将校验规则保存在特定的框架文件中,这样,输入校验和Action实现了分离,提高了系统的维护性。 基于框架的校验有两种编写校验规则文件的写法, 一种是使

15、用字段校验的写法, 一种是使用非字段校验的写法。,输入校验,编写校验规则文件 Struts2提供了基于验证框架的输入校验,只需编写简单的配置文件,Struts2的验证框架将会负责进行服务器校验和客户校验。 可以利用配置文件,实现校验信息的国际化提示 实例:ValidateDemo 使用客户端校验 将输入页面的表单元素改为使用struts2标签实现 为元素增加validate=“true”属性 将页面移动到WEB-INF/content目录下,使核心filter起作用。 实例:ClientValidate,应用Struts2校验框架(1),校验框架以声明的方式来实现输入校验,将检验代码从Acti

16、on代码中转移到XML配置文件中,从而可以实现Action代码的简化。 Struts2将一些常用的校验功能进行了封装,以校验器形式存在,当需要实现校验功能的时候,只需在XML配置文件中进行配置即可。,Validation框架校验,在配置文件中配置需要校验的字段和校验规则,即可以对相应的字段进行校验 配置文件命名为xxxx-validation.xml,validation框架校验的DTD, 直接拷贝即可,validators、field、field-validator,validators将需进行校验的所有内容进行封装 field标签封装某特定字段 field-validator表明校验类型,

17、只校验field字段,基于框架的输入校验,.1 使用字段校验的输入校验 ValidateByFieldXmlAction-validation.xml的关键代码如下:,type指定校验类型,常用校验类型如下: required:必填字段校验 requiredstring:非空String检查 int:Int类型范围校验 double:Double类型范围校验 date:日期校验 Expression:使用OGNL表达式的校验 fieldexpression:针对一个字段使用OGNL表达式的校验 email:Email校验 url:URL校验 regex:正则表达式校验 stringlength

18、:字符产长度校验,应用Struts2校验框架(2),Struts2提供的常用功能的校验器放在comopensymphonyxwork2validatorvalidatorsdefault.xml文件中。,输入校验,字段校验器配置风格 元素是校验规则文件的基本组成单位 true 非字段校验器配置风格 元素是校验规则文件的基本组成单位 name true 短路校验器 为或指定一个short-circuit=“true”属性,将某些校验提示信息屏蔽。 true ,字段校验器与非字段校验器,前例中的校验器以字段为中心,封装在中,然后通过子标签的type属性指定校验器类型,此种校验器被称为字段校验器 实

19、际上是一种校验类型 只校验父标签所指向字段 Struts提供以校验规则位中心的使用标签的另外一种非字段校验器 写法不同 其中 为校验器类型 其中 为校验字段,写法总是一样的,param的值又是在哪里找到的呢? param中的name值在上述类中被定义为属性。譬如说在类 com.opensymphony.xwork2.validator.validators.StringLengthFieldValidator中(也就是 stringLength对应的处理类),就定义了 boolean trim; int minLength,maxLength; 及它们的get/set方法。,message的注

20、意事项 (1)每个field都必须拥有一个message;message错误信息最后是以addFieldError实现的,也就是说是 field一级的错误。 (2)message中可以引用param变量,引用格式为$param1,如上面的例子中对password验证失败的报错 信息。 (3)message的内容可以放到全局i18n属性文件中,并在message中以key属性值指定,比如上面例子中 对username验证失败的报错信息。,输入校验,校验文件的搜索规则 当一个Action包含多个处理逻辑或者两个Action有继承关系,此时需要为校验规则文件增加校验规则别名文件的方式来实现校验的处理

21、逻辑。 总的校验规则是多个校验规则文件的规则总和 实例:overrideRule 基于Annotation的输入校验 使用Annotation来定义每个字段应该满足的规则 使用验证器Annotation修饰Action里各属性对应的setter方法 实例:annotation,输入校验,内建校验器 必填校验器 必填字符串校验器 整数校验器 日期校验器 表达式校验器 字段表达式校验器 邮件地址校验器 网址校验器 Vistor校验器 转换校验器 字符串长度校验器 正则表达式校验器 实例:validatorDemo,Struts 2数据验证及验证框架的应用,2. Struts 2验证框架的应用 St

22、ruts 2提供了校验框架,只需要增加一个校验配置文件,就可以完成对数据的校验。Struts 2提供了大量的数据校验器,包括表单域校验器和非表单域校验器两种。 (1)必填字符串校验器 其校验规则定义文件如下:, true 姓名是必需的! ,Struts 2数据验证及验证框架的应用,(2)必填校验器 该校验器的名字是required,也就是属性中的type=required,该校验器要求指定的字段必须有值,与必填字符串校验器最大的区别就是可以有空字符串。如果把上例改为必填校验器,其代码应为:, 姓名是必需的! ,Struts 2数据验证及验证框架的应用,(3)整数校验器 该校验器的名字是int,该校验器要求字段的整数值必须在指定范围内,故其有min和max参数。如果有个age输入框,要求其必须是整数,且输入值必

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论