输入校验是web应用必须处理的问题,要防止用户的误输入和恶意非法输入。struts2给我们提供了非常强大的输入校验体系。 

输入校验分为客户端校验和服务器端校验。一般开发中两者都用,但是服务端校验必须使用。 

客户端校验是通过javascript在表单页面进行初步过滤。客户端校验并不安全,攻击者有很多方法可以绕过客户端校验,所以服务端校验是必不可少的。 

但是客户端校验必不可少,因为大多数浏览者都是正常用户,可以阻止一些误操作,降低了服务器的负载。 

服务端校验:
我们以前在servlet中增加校验。是通过获取参数,然后判断参数是否为空和长度等等来进行校验。
在servlet中使用硬编码进行输入校验乏味而又繁琐,struts2提供了基于校验框架的输入校验,只需要指定简单的配置文件即可。

一、声明式验证:通过xml配置文件进行验证

-校验规则文件与Action类放在同一目录下
-校验配置文件名称为 ActionClassName-validation.xml 例如 :UserAction-validation.xml 增加校验文件后,系统会自动加载该文件。当用户提交请求时,struts2会根据该文件对用户数据进行校验

二、基于表单字段的配置风格

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE validators PUBLIC
"-//Apache Struts//XWork Validator 1.0.3//EN"
"http://struts.apache.org/dtds/xwork-validator-1.0.3.dtd">
//校验文件的根元素
<validators>
//被校验表单项名称
<field name="username">
//指定校验器,struts2有很多内建校验器,requiredstring是校验数据是否为空并去除两端空格
<field-validator type="requiredstring">
//校验失败后的提示信息
<message>用户名不能为空</message>
</field-validator>
</field>
</validators>
校验失败后,struts2会返回名为input的逻辑视图名,因此我们还需要添加一个<result>   

这个配置文件是全局验证。也就是这个Action中的所有动作都会被验证,我们Action有的方法并不需要验证,加入验证甚至会出错。 

    我们有两种方式可以让不需要验证的方法跳过验证: 

    第一种:在不需要验证的方法前面添加注解@SkipValidation  

    第二种:针对动作类中的某个方法进行验证,创建的XML文件名为 ActionClassName-ActionName-validation.xml ,这里的ActionName不是方法名,而是配置的action名字 ,例如 :UserAction-regist-validation.xml

 

三、非字段配置风格(基于验证器的配置风格)

<validators>
//验证器类型
<validator type="requiredstring">
//要校验的参数名字
<param name="fieldName">password</param>
//校验失败后返回的信息
<message>密码不能为空</message>
</validator>
</validators>

四、短路校验器

校验配置文件的<field-validator>和<validator>元素可以指定一个可选的short-circuit属性,指定该校验器是否是短路校验器,默认是false。 

    短路校验器的作用是如果一个字段内有多个校验器,如果一个校验器校验失败,其他校验器根本不会继续校验。

    校验器的执行顺序
-所有基于验证器的配置风格的校验器优先于字段风格的校验器
-所有的基于验证器风格的校验器,排在前面的先执行
-所有的基于字段风格的校验器,排在前面的先执行。 校验器的短路原则
-所有的非字段校验器最先执行,如果某个非字段校验器校验失败,则该字段上的所有字段校验器都不会执行
-非字段校验器校验失败,不会阻止其他非字段校验器的执行
-如果某个字段校验器校验失败,则该字段下的后面的字段校验器都不会执行
-字段校验器永远都不会阻止非字段校验器的执行

五、struts2的内建校验器

            required:必填验证器,要求指定的字段必须有值。使用非字段风格的配置时,可以配置fieldName属性来设置要校验的表单项名称。 

            requiredstring:必填字符串验证器。 

            int、long、short:整数校验器。要求字段的整数值必须在指定范围内。参数:min指定该属性最小值,不指定不检查最小值。max指定该属性最大值,不指定不检查最大值。 

            date:日期校验器。要求字段的日期值必须在指定范围内。参数:min最小日期 ,max最大日期 

            expression:表达式校验器,它只能被非字段风格配置。参数:expression指定一个逻辑表达式。 

            fieldexpression:字段表达式校验器。要求字段满足一个逻辑表达式。 

            email:邮件校验器。要求被检查字段非空,并且必须是合法的邮箱地址,底层是正则表达式。 

            url:网址校验器。要求被检查字段非空并且是个发的url地址,底层是正则表达式。 

            stringlength:字符串长度校验器。要求字段长度必须在指定的范围内。参数:manLength 最大长度  minLength最小长度 

            regex:正则表达式校验器。
等等。

六、自定义校验

struts2内建的校验器可以完成大部分输入校验。但是有时候无法满足一些特殊的要求,struts2允许通过手动方式完成自定义校验。 

        继承ActionSupport,重写validate方法
public void validate() {
if(user.getUsername()==null||user.getUsername().isEmpty()){
addFieldError("username", "用户名不能为空!!!");
}
} 重写validate方法会检验action类里的所有方法,我们不需要校验某些方法,有两种方法。 第一种:在不需要校验的方法前加上注解@SkipValidation
第二种:重写validateXxx方法,Xxx即为要验证的方法名
public void validateRegist() {
if(user.getUsername()==null||user.getUsername().isEmpty()){
addFieldError("username", "用户名不能为空!!!");
} }

七、struts2的输入校验流程

1.对字符串类型的请求参数进行类型转换,并且设置给JavaBean的属性 

2.类型转换中可能出现异常,如果出现异常,将异常信息保存并封装 

3.调用struts2的输入校验规则进行输入校验(根据各种vatidate.xml文件里定义的校验规则) 

4.通过反射调用validateXxx方法进行校验  

5.调用validate方法校验 

6.上面的校验出现错误,转到input对应的视图资源。没错误,调用action中的处理方法。

  

  

  

  

 

  

  

  

最新文章

  1. 解决svn问题:Wrong committed revision number: -1
  2. Unity3D 计算FPS
  3. iOS字体
  4. CSS3 text-shadow
  5. docker搭建ros-indigo-arm交叉编译环境
  6. Python学习【第四篇】用户输入及判断
  7. POJ3463Sightseeing[次短路计数]
  8. BCG界面库下的Windows8 UI界面样式www.webui8.com
  9. C#学习笔记(十五):预处理指令
  10. linux配置JDK(转载)
  11. Hoax or what
  12. Poco之ftp目录切换与创建
  13. Tomcat基础教程(二)
  14. Linux解析内核源代码——传输控制块诞生
  15. Java Socket:Java-NIO-ServerSocketChannel
  16. Git命令(Git版本:Linux 2.14.3)
  17. Python全栈开发记录_第十篇(反射及选课系统练习)
  18. ios成长之每日一遍(day 1)
  19. NGINX高并发配置
  20. WWDC: Thread Sanitizer and Static Analysis

热门文章

  1. Window下Scala开发环境搭建
  2. 如何用python自动编写《赤壁赋》word文档
  3. JVM基础入门
  4. dategrip的使用技巧
  5. 【Notes_9】现代图形学入门——光线追踪(基本原理)
  6. Kubernetes中分布式存储Rook-Ceph的使用:一个ASP.NET Core MVC的案例
  7. JPEG解码——(5)反量化和逆ZigZag变换
  8. System.IO.IOException:“找不到资源“window1.xaml”。” 解决方法
  9. kali 将家目录下的中文文件名修改成英文
  10. XAPKInstaller - XAPK游戏包安装器