输入校验分为客户端校验和服务器校验。Struts2可以同时完成这两种校验。
All input is evil.——《Writing Secure Code》
手动完成输入校验:
- 重写Action中的validate()方法(继承自ActionSupport类)
- 重写Action中的validateXxx()方法并在struts.xml中配置,validateXxx()方法先于validate()方法被调用
流程:
- 类型转换器负责对字符串的请求参数执行类型转换,并将这些值设置成Action的属性值
- 在执行类型转换过程中可能出现异常,如果出现异常,将异常信息保存到ActionContext中,conversationError拦截器负责将其封装到fieldError里,然后执行第3步;如果转换过程没有异常信息,直接进入第3步
- 通过反射调用validateXxx()方法,其中Xxx是即将处理用户请求的处理逻辑所对应的方法名
- 调用Action类里的validate()方法
- 如果经过上面4步都没有出现fieldError,将调用Action里处理用户请求的处理方法;如果出现了fieldError,系统将转入input逻辑视图所指定的视图资源
基本输入校验(推荐):
- 编写校验规则文件(XML配置文件),文件名命名方式为<Action名字>-validation.xml,并于Action类文件保存在相同路径下。
- 为个别处理逻辑检验的文件名命名方式为<Action名字>-<处理方法名>-validation.xml,同样要与Action类文件保存在同一路径下。
- 国际化提示信息(略)
- 使用客户端校验,使用Struts表单标签,并增加validate="true"属性
- 检验文件的搜索规则,BaseAction-validation.xml→BaseAction-别名-validation.xml→XxxAction-validation.xml→XxxAction-别名-validation.xml
<?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="字段名"> <field-validator type="required" [short-circuit="true"]> <message>错误提示信息</message> </field-validator> </field> <!-- 必填字符串校验 --> <field name="字段名"> <field-validator type="requiredstring" [short-circuit="true"]> <param name="trim">默认为true</param> <!-- 是否在检验前截断被检验属性值前后的空白 --> <message key="没有填写密码!" /> </field-validator> </field> <!-- 整数校验 --> <field name="字段名"> <field-validator type="int" [short-circuit="true"]> <param name="min">最小值</param> <param name="max">最大值</param> <message>错误提示信息</message> </field-validator> </field> <!-- 日期校验 --> <field name="字段名"> <field-validator type="date" [short-circuit="true"]> <param name="min">1990-01-01</param> <param name="max">2010-01-01</param> <message>错误提示信息</message> </field-validator> </field> <!-- 表达式校验 --> <validator type="expression" [short-circuit="true"]> <param name="expression">逻辑表达式</param> <!-- 返回false则校验失败,输出信息 --> <message>错误提示信息</message> </validator> <!-- 字段表达式校验 --> <field name="字段名"> <field-validator type="fieldexpression" [short-circuit="true"]> <param name="expression">逻辑表达式</param> <!-- 返回false则校验失败,输出信息 --> <message>错误提示信息</message> </field-validator> </field> <!-- 邮件地址校验 --> <field name="字段名"> <field-validator type="email" [short-circuit="true"]> <message>错误提示信息</message> </field-validator> </field> <!-- 网址校验 --> <field name="字段名"> <field-validator type="url" [short-circuit="true"]> <message>错误提示信息</message> </field-validator> </field> <!-- Visitor校验:校验Action类里的非基本属性 --> <field name="字段名"> <field-validator type="visitor" [short-circuit="true"]> <param name="context">字段名Context</param> <!-- 调用Action-字段名Context-validation.xml --> <param name="appendPrefix">true</param> <!-- 指定检验失败后提示信息是否添加下面的前缀 --> <message>提示信息前缀</message> </field-validator> </field> <!-- 转换校验 --> <field name="字段名"> <field-validator type="conversion" [short-circuit="true"]> <param name="repopulateField">true</param> <!-- 转换失败后,返回输入页仍保留原来的错误输入 --> <message>错误提示信息</message> </field-validator> </field> <!-- 字符串长度校验 --> <field name="字段名"> <field-validator type="stringlength" [short-circuit="true"]> <param name="minLength">最小值</param> <param name="maxLength">最大值</param> <param name="trim">默认为true</param> <message>错误提示信息</message> </field-validator> </field> <!-- 正则表达式校验 --> <field name="字段名"> <field-validator type="regex" [short-circuit="true"]> <param name="expression">正则表达式</param> <param name="caseSensitive">默认为true</param> <!-- 是否区分大小写 --> <message>错误提示信息</message> </field-validator> </field> </validators>
时间: 2024-10-16 20:23:45