第五讲数据校验课件.ppt
第五讲数据校验第1页,此课件共51页哦本次课的主要内容输入校验342.第2页,此课件共51页哦本章主要内容v 简介v 用validate方法进行输入校验validate()方法输入校验、validateXxx()方法输入校验 v 基于框架的输入校验使用字段校验的输入校验、使用非字段校验的输入校验第3页,此课件共51页哦简介vWeb技术的发展给用户带来了方便,使用浏览器就可以完成某些工作。在方便使用的同时,也将系统输入界面暴露给用户,面临大量恶意破坏性输入的考验。例如金额的输入框中输入字母汉字,日期的输入框输入不正确的格式或不可能存在的日期等。这些都需要我们通过输入校验来解决。输入校验直接影响了系统的抗破坏性能和稳定性。v实际上,输入校验往往同类型转换联系在一起,都是对用户输入数据的规范化检查和处理,我们可以通过JavaScript来实现客户端校验,但一般都只是完成初步的检查和过滤,但对于需要与服务器交互的逻辑性校验就无能为力了,虽然提高了相应速度,但是功能有很大局限性,代码维护性也不好。我们不来讲解JavaScript的客户端校验,只是来看看Struts2为我们提供的输入校验方法。第4页,此课件共51页哦Struts 2输入校验v 输入校验分为客户端校验和服务器端校验。v 客户端校验可以过滤掉用户的错误操作,是第一道防线,一般使用JavaScript代码实现。仅有客户端验证还是不够的。攻击者还可以绕过客户端校验直接进行非法输入,这样可能会引起系统的异常,所以必须加上服务器端的验证。但仅有服务器端验证也是不行的,客户的错误操作总是提交到服务器,由服务器端进行验证返回错误信息,这样会加重服务器的负担。v 所以客户端验证和服务器端验证缺一不可,两者结合起来才可以构建健壮的系统。第5页,此课件共51页哦什么是输入校验v输入校验,从字面上来看好像是指对如输入的密码或者用户名输入错误的校验。其实这个不算输入校验,这个算是业务逻辑的判断了。输入校验是对输入的用户名长度、密码长度、年龄信息等的判断。为了给大家一个感官上的认识,现在打开163邮箱的注册页面,如图所示。第6页,此课件共51页哦为什么要进行输入校验v那为什么要进行输入校验呢?使用它有什么好处呢?为了更好地说明,来看下面这个注册页面,如图所示。v现在按常规输入用户注册信息,单击“注册”按钮进行注册。页面跳转到注册信息显示页,如图所示。第7页,此课件共51页哦输入校验v Struts2的输入校验步骤对请求参数执行类型转换转换是否出错将错误提示保存到ActionContext内建验证器进行验证conversionError负责将其转换成fieldError执行validateXxx()方法执行validate()方法包含fieldError吗调用Action的处理方法呈现视图资源是否是,跳过Action处理逻辑,返回input视图否第8页,此课件共51页哦输入校验v 手动完成输入校验重写validate()方法 继承ActionSupport类,重写validate()方法 实例:OverrideValidate重写validateXxx()方法 对于多个处理逻辑的校验,会有多个validateXxx()方法,重写这多个方法,可以实现对不同处理逻辑的独立校验处理。实例:ValidateXxx第9页,此课件共51页哦手工编写代码实现输入校验通过重写validate()或validateXxx()方法实现,validate()方法会校验action中所有与execute方法签名相同的方法。validateXxx()只会校验action中方法名为Xxx的方法。其中Xxx的第一个字母要大写。当某个数据校验失败时,我们应该调用addFieldError()方法往系统的fieldErrors添加校验失败信息(为了使用addFieldError()方法,action可以继承ActionSupport),如果系统的fieldErrors包含失败信息,struts2会将请求转发到名为input的result。在input视图中可以通过显示失败信息。validate()使用例子:使用例子:Overridepublic void validate()if(username=null&.equals(username.trim()this.addFieldError(username,用户名不能为空用户名不能为空);validateXxx()方法使用例子:方法使用例子:public String add()throws Exceptionreturn success;public void validateAdd()if(username=null&.equals(username.trim()this.addFieldError(username,用户名不能为空用户名不能为空);验证失败后,请求转发至验证失败后,请求转发至input视图:视图:/WEB-INF/page/addUser.jsp在在addUser.jsp页面中使用页面中使用显示失败信息。显示失败信息。第10页,此课件共51页哦输入校验的流程1。类型转换器对请求参数执行类型转换,并把转换后的值赋给action中的属性。2。如果在执行类型转换的过程中出现异常,系统会将异常信息保存到ActionContext,conversionError拦截器将异常信息封装到fieldErrors里,然后执行第3步。如果类型转换没有出现异常,则直接进入第3步。3。系统通过反射技术调用action中的validateXxx()方法,Xxx为方法名。4。调用action中的validate()方法。5。经过上面4步,如果系统中的fieldErrors存在错误信息(即存放错误信息的集合的size大于0),系统自动将请求转发至名称为input的视图。如果系统中的fieldErrors没有任何错误信息,系统将执行action中的处理方法。第11页,此课件共51页哦用validate方法进行输入校验1 1 validat te()方法输入方法输入校验校验我们先来学习validate()方法进行校验。创建“com.ntc.sample.sshvalidate”的package包。并在其下边建立ValidateAction类,关键代码如下所示。校验逻辑如代码注释,对于用户名,必须输入,对于密码必须长度在6-10。注意:使注意:使用用validat te()方法必须方法必须继承继承Act tionSuSupportrt类类第12页,此课件共51页哦用validate方法进行输入校验validate()方法输入校验方法输入校验接着创建validate.jsp,用来输入用户名和密码。代码如下所示,第13页,此课件共51页哦 用validate方法进行输入校验.1 validate()方法输入校验方法输入校验 然后创建校验成功后的页面detail.jsp,代码如下所示。第14页,此课件共51页哦 用validate方法进行输入校验.1 validate()方法输入校验方法输入校验 在src目录下建立配置文件struts.xml,如下所示。第15页,此课件共51页哦 用validate方法进行输入校验.1 1 validat te()方法输入方法输入校验校验初始化的页面如下图所示。第16页,此课件共51页哦 用validate方法进行输入校验.1 validate()方法输入校验方法输入校验 点击确认后,我们的校验执行了,这里,每个输入域都会出现对应的错误信息,效果图如下。第17页,此课件共51页哦 用validate方法进行输入校验.1 validate()方法输入校验方法输入校验 当我们输入符合条件的数据但不是admin和password时,例如输入admi和1234567时,返回输入页面但是没有出错信息,说明校验是正常通过的只是逻辑不正确。第18页,此课件共51页哦 用validate方法进行输入校验.1 validate()方法输入校验方法输入校验 我们再来输入admin和password,将迁移到detail.jsp,表示校验正常,逻辑也正确。第19页,此课件共51页哦 用validate方法进行输入校验.1 validate()方法输入校验方法输入校验 我们还可以在validate.jsp中加入如下代码,这样可以把所有的异常信息显示出来。我们把它放在了上边,出错的时候,错误信息除了在每个输入框处显示外,在页面最下端也会把所有的错误显示出来。效果图。第20页,此课件共51页哦 用validate方法进行输入校验.2 validateXxx()方法输入校验方法输入校验v对于使用validate()方法校验,我们在Action中所有的处理方法都会进行数据校验,可以把所有要验证的逻辑代码都写入其中,但是却不利于维护,而validateXXX可以将某逻辑的校验代码从validate分离出来。v validateXxx()方法则是对不同的业务方法进行数据校验。例如,我们有一个login()方法,我们使用validateLogin()方法来处理数据输入校验。v我们来看一个例子里面的ValidateXxxAction类,里边定义一个login方法,并建立validateLogin方法v注意:由于注意:由于validate()方法对方法对Action类中所有方法进行校验,所以,在使用类中所有方法进行校验,所以,在使用validateXxx()方方式时,最好去掉式时,最好去掉validate()方法的代码,或者检查两者不需要重复校验。方法的代码,或者检查两者不需要重复校验。第21页,此课件共51页哦 用validate方法进行输入校验.2 validateXxx()方法输入校验方法输入校验v 以下是校验类的校验方法的主要代码。注意:使注意:使用用validat teXxx()方法必方法必须继承须继承Act tionSuSupportrt类类第22页,此课件共51页哦 用validate方法进行输入校验.2 validateXxx()方法输入校验方法输入校验v 我们再来看validatexxx.jsp,只是form的action改成了validatexxx,其他的也没有变化,主要代码如下。第23页,此课件共51页哦 用validate方法进行输入校验.2 validateXxx()方法输入校验方法输入校验v Struts.xml关键代码如下。第24页,此课件共51页哦当validate()和validateXXX都存在时v validateXXX方法校验得到的错误信息先显示出来,然后才是validate方法校验的字段错误信息v validate方法在validateXXX方法被调用后,依然会被调用错误信息均保留在ArrayList中,谁先运行,谁的结果就排在前面第25页,此课件共51页哦Struts的输入校验流程v 客户端提交数据后,Struts2进行类型转换v 类型转换成功后,调用validateXXX方法v 调用完validateXXX方法后,继续调用validate方法v 如果没有字段错误,则调用Action处理方法;有错误,则返回inputv Action处理结束后,返回结果,转入相应的web页第26页,此课件共51页哦 基于框架的输入校验v 我们上节用validate()和validateXxx()方法进行了校验,这种方式的校验的弊端就是写在了Action实现类中,使Action变得复杂臃肿,同时提高了Action同输入校验之间的耦合度。v Struts2框架提供了一种基于框架文件的输入校验方式,将校验规则保存在特定的框架文件中,这样,输入校验和Action实现了分离,提高了系统的维护性。v 基于框架的校验有两种编写校验规则文件的写法,一种是使用字段校验的写法,一种是使用非字段校验的写法。第27页,此课件共51页哦输入校验v 编写校验规则文件Struts2提供了基于验证框架的输入校验,只需编写简单的配置文件,Struts2的验证框架将会负责进行服务器校验和客户校验。可以利用配置文件,实现校验信息的国际化提示实例:ValidateDemov 使用客户端校验将输入页面的表单元素改为使用struts2标签实现为元素增加validate=“true”属性将页面移动到WEB-INF/content目录下,使核心filter起作用。实例:ClientValidate第28页,此课件共51页哦应用应用Struts2校验框架(校验框架(1)v 校验框架以声明的方式来实现输入校验,将检验代码从Action代码中转移到XML配置文件中,从而可以实现Action代码的简化。vStruts2将一些常用的校验功能进行了封装,以校验器形式存在,当需要实现校验功能的时候,只需在XML配置文件中进行配置即可。第29页,此课件共51页哦Validation框架校验v 在配置文件中配置需要校验的字段和校验规则,即可以对相应的字段进行校验v 配置文件命名为xxxx-validation.xml第30页,此课件共51页哦validation框架校验的DTDv 直接拷贝即可第31页,此课件共51页哦validators、field、field-validatorv validators将需进行校验的所有内容进行封装v field标签封装某特定字段v field-validator表明校验类型,只校验field字段第32页,此课件共51页哦 基于框架的输入校验.1 使用字段校验的输入校验使用字段校验的输入校验v ValidateByFieldXmlAction-validation.xml的关键代码如下:type指定校验类型,常用校验类型如下:required:必填字段校验requiredstring:非空String检查int:Int类型范围校验double:Double类型范围校验date:日期校验Expression:使用OGNL表达式的校验fieldexpression:针对一个字段使用OGNL表达式的校验email:Email校验URL校验regex:正则表达式校验stringlength:字符产长度校验第33页,此课件共51页哦应用应用Struts2校验框架(校验框架(2)vStruts2提供的常用功能的校验器放在comopensymphonyxwork2validatorvalidatorsdefault.xml文件中。第34页,此课件共51页哦输入校验v字段校验器配置风格元素是校验规则文件的基本组成单位truev非字段校验器配置风格元素是校验规则文件的基本组成单位nametruev短路校验器为或指定一个short-circuit=“true”属性,将某些校验提示信息屏蔽。true第35页,此课件共51页哦字段校验器与非字段校验器v前例中的校验器以字段为中心,封装在中,然后通过子标签的type属性指定校验器类型,此种校验器被称为字段校验器实际上是一种校验类型只校验父标签所指向字段vStruts提供以校验规则位中心的使用标签的另外一种非字段校验器 写法不同 其中为校验器类型 其中为校验字段,写法总是一样的第36页,此课件共51页哦vparam的值又是在哪里找到的呢?vparam中的name值在上述类中被定义为属性。譬如说在类 com.opensymphony.xwork2.validator.validators.StringLengthFieldValidator中(也就是 stringLength对应的处理类),就定义了vboolean trim;vint minLength,maxLength;v 及它们的get/set方法。第37页,此课件共51页哦v message的注意事项v(1)每个field都必须拥有一个message;message错误信息最后是以addFieldError实现的,也就是说是 field一级的错误。v(2)message中可以引用param变量,引用格式为$param1,如上面的例子中对password验证失败的报错 信息。v(3)message的内容可以放到全局i18n属性文件中,并在message中以key属性值指定,比如上面例子中 对username验证失败的报错信息。第38页,此课件共51页哦输入校验v 校验文件的搜索规则当一个Action包含多个处理逻辑或者两个Action有继承关系,此时需要为校验规则文件增加校验规则别名文件的方式来实现校验的处理逻辑。总的校验规则是多个校验规则文件的规则总和实例:overrideRulev 基于Annotation的输入校验使用Annotation来定义每个字段应该满足的规则使用验证器Annotation修饰Action里各属性对应的setter方法实例:annotation第39页,此课件共51页哦输入校验v内建校验器必填校验器必填字符串校验器 整数校验器日期校验器 表达式校验器 字段表达式校验器 邮件地址校验器网址校验器Vistor校验器 转换校验器字符串长度校验器 正则表达式校验器 实例:validatorDemo第40页,此课件共51页哦Struts 2数据验证及验证框架的应用v2.Struts 2验证框架的应用 Struts 2提供了校验框架,只需要增加一个校验配置文件,就可以完成对数据的校验。Struts 2提供了大量的数据校验器,包括表单域校验器和非表单域校验器两种。(1)必填字符串校验器)必填字符串校验器 其校验规则定义文件如下:true姓名是必需的!姓名是必需的!第41页,此课件共51页哦Struts 2数据验证及验证框架的应用(2)必填校验器 该校验器的名字是required,也就是属性中的type=required,该校验器要求指定的字段必须有值,与必填字符串校验器最大的区别就是可以有空字符串。如果把上例改为必填校验器,其代码应为:姓名是必需的!姓名是必需的!第42页,此课件共51页哦Struts 2数据验证及验证框架的应用(3)整数校验器 该校验器的名字是int,该校验器要求字段的整数值必须在指定范围内,故其有min和max参数。如果有个age输入框,要求其必须是整数,且输入值必须在18与100之间,该校验器的配置应该为:18100年龄必须在年龄必须在18至至100之间之间第43页,此课件共51页哦Struts 2数据验证及验证框架的应用(4)日期校验器 该校验器的名字是date,该校验器要求字段的日期值必须在指定范围内,故其有min和max参数。其配置格式如下:1980-01-012009-12-31日期必须在日期必须在1980-01-01至至2009-12-31之间之间第44页,此课件共51页哦Struts 2数据验证及验证框架的应用(5)邮件地址校验器 该校验器的名称是email,该校验器要求字段的字符如果非空,就必须是合法的邮件地址。如下面的代码:必须输入有效的电子邮件地址必须输入有效的电子邮件地址 第45页,此课件共51页哦Struts 2数据验证及验证框架的应用(6)网址校验器 该校验器的名称是url,该校验器要求字段的字符如果非空,就必须是合法的URL地址。如下面的代码:必须输入有效的网址必须输入有效的网址 第46页,此课件共51页哦Struts 2数据验证及验证框架的应用(7)字符串长度校验器 该校验器的名称是stringlength,该校验器要求字段的长度必须在指定的范围内,一般用于密码输入框。如下面的代码:620密码长度必须在密码长度必须在6到到20之间之间第47页,此课件共51页哦Struts 2数据验证及验证框架的应用(8)正则表达式校验器 该校验器的名称是regex,它检查被校验字段是否匹配一个正则表达式。如下面的代码:学号必须是学号必须是6位的数字位的数字 第48页,此课件共51页哦输入转换错误v 当年龄处未填写符合要求的整数的时候,结果如下:v 同时:第49页,此课件共51页哦Invalid field value for field age.v 系统产生的错误提示,报告在age字段,出现invalid field valuev 分析出错信息,如何应对?v 5分钟第50页,此课件共51页哦修改Actionv setAge方法出错v age在出错后,自动赋值为0第51页,此课件共51页哦