服务器端输入验证

一、没有使用框架情况下,在目标方法处,通过手动的编写代码来进行验证

二、Struts2

1.支持声明式验证,即通过配置的方式来验证。需要实现接口 ValidationAware,依赖于两个拦截器 validation 和 workflow 拦截器。

validation 拦截器:进行验证和创建字段错误列表

workflow  拦截器:检查 validation 拦截器发现的错误,如果发现,返回 "input"(默认)result。

如果没有指定 name=input 对应的 result ,则返回一个错误消息告诉我们 "there's no "input" result defined for the action"。

2. Struts2 默认的验证器

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE validators PUBLIC
        "-//Apache Struts//XWork Validator Definition 1.0//EN"
        "http://struts.apache.org/dtds/xwork-validator-definition-1.0.dtd">
 
<validators>
    <validator name="required" class="com.opensymphony.xwork2.validator.validators.RequiredFieldValidator"/>
    <validator name="requiredstring" class="com.opensymphony.xwork2.validator.validators.RequiredStringValidator"/>
    <validator name="int" class="com.opensymphony.xwork2.validator.validators.IntRangeFieldValidator"/>
    <validator name="long" class="com.opensymphony.xwork2.validator.validators.LongRangeFieldValidator"/>
    <validator name="short" class="com.opensymphony.xwork2.validator.validators.ShortRangeFieldValidator"/>
    <validator name="double" class="com.opensymphony.xwork2.validator.validators.DoubleRangeFieldValidator"/>
    <validator name="date" class="com.opensymphony.xwork2.validator.validators.DateRangeFieldValidator"/>
    <validator name="expression" class="com.opensymphony.xwork2.validator.validators.ExpressionValidator"/>
    <validator name="fieldexpression" class="com.opensymphony.xwork2.validator.validators.FieldExpressionValidator"/>
    <validator name="email" class="com.opensymphony.xwork2.validator.validators.EmailValidator"/>
    <validator name="url" class="com.opensymphony.xwork2.validator.validators.URLValidator"/>
    <validator name="visitor" class="com.opensymphony.xwork2.validator.validators.VisitorFieldValidator"/>
    <validator name="conversion" class="com.opensymphony.xwork2.validator.validators.ConversionErrorFieldValidator"/>
    <validator name="stringlength" class="com.opensymphony.xwork2.validator.validators.StringLengthFieldValidator"/>
    <validator name="regex" class="com.opensymphony.xwork2.validator.validators.RegexFieldValidator"/>
    <validator name="conditionalvisitor" class="com.opensymphony.xwork2.validator.validators.ConditionalVisitorFieldValidator"/>
</validators>

3.验证规则配置文件

(1)位置:在需要验证的 Action 同包下。

(2)当前 Action 类所有 action 使用同样的验证规则:Action简单类名-validation.xml

(3)当前 Action 类某个 action 使用具体的验证规则:Action简单类名-ActionName-validation.xml

4. 验证分类

(1)字段验证(Field Validator Syntax)

e1:验证 myPurchaseCode 字段长度必须为10

<validators>
    <field name="myPurchaseCode">
        <field-validator type="stringlength">
             <param name="minLength">10</param>
             <param name="maxLength">10</param>
             <param name="trim">true</param>
             <message>Your purchase code needs to be 10 characters long</message>
        </field-validator>
    </field>
</validators>

e1:验证 age 必须在 20 到 50 之间

<validators>
    <field name="age">
         <field-validator type="int">
             <param name="min">20</param>
             <param name="max">50</param>
             <message>Age needs to be between ${min} and ${max}</message>
         </field-validator>
     </field>
</validators>

(2)类型验证(Plain Validator Syntax)

e1:验证 myPurchaseCode 字段长度必须为10:

<validators>
    <validator type="stringlength">
        <param name="fieldName">myPurchaseCode</param>
        <param name="minLength">10</param>
        <param name="maxLength">10</param>
        <param name="trim">true</param>
        <message>Your purchase code needs to be 10 characters long</message>
    </validator>
</validators>

e2:验证 age 必须在 20 到 50 之间

<validators>
     <validator type="int">
         <param name="fieldName">age</param>
         <param name="min">20</param>
         <param name="max">50</param>
         <message>Age needs to be between ${min} and ${max}</message>
     </validator>
</validators>

(3)表达式验证

e:判断密码和确认密码输入是否一致

<validators>
  <validator type="expression">
        <param name="expression"><![CDATA[pwd==pwdConfirm]]></param>
        <message>密码和确认密码不一致</message>
    </validator>
</validators>

其中:<param name="expression"> 标签体中的内容会自动进行 OGNL 解析。

5.短路验证:

对于同一个字段进行多个规则验证,如果第一个验证没有通过,则后续的规则不进行验证。

只需要在 validator 或 field-validator 标签内加入 short-circuit 属性并设置为 true 即可。

如:

<validators>
    <field name="email">
        <field-validator type="stringlength" short-circuit="true">
            <param name="minLength">4</param>
            <param name="maxLength">10</param>
            <param name="trim">true</param>
            <message>email length must between ${minLength} and ${maxLength}</message>
        </field-validator>
        <field-validator type="email">
            <message>Must provide a valid email</message>
        </field-validator>
    </field>
</validators>
email validate

6.类型转换失败提示与验证出错提示消息

struts2 默认的拦截器栈为 defaultStack,规定了 conversionError 拦截器在 validation 拦截器之前执行。但是 conversionError 拦截器拦截到类型转换出错的消息,并不会返回 "input",而是继续让proxy调用后续的拦截器。

这里的源码我们不能进行更改,但是我们可以仿造一个,类的加载顺序是采取的就近原则。所以我们在项目的 src 目录下,新建与 conversionError 拦截器对应的目录结构,然后修改 conversionError 拦截器代码。

7.对 Action 类的要求

要验证的字段,必须提供 getXxx() 和 setXxx() 方法,getXxx() 方法用于 validate 拦截器进行比较验证。

8.一个简单的例子:

<s:form action="/validateNum">
            <s:textfield name="age" label="age"/>
            <s:submit label="submit"/>
</s:form>
form 表单
<!DOCTYPE validators PUBLIC
        "-//Apache Struts//XWork Validator 1.0.2//EN"
        "http://struts.apache.org/dtds/xwork-validator-1.0.2.dtd">

<validators>
    <field name="age">
        <field-validator type="int">
            <param name="min">20</param>
            <param name="max">50</param>
            <message>Age needs to be between ${min} and ${max}</message>
        </field-validator>
    </field>
</validators>
ValidateAction-validation.xml
<struts>
    <package name="default" namespace="/" extends="struts-default">
        <action name="validateNum" class="com.nucsoft.struts.ValidateAction">
            <result>/success.jsp</result>
            <result name="input">/index.jsp</result>
        </action>
</struts>
struts.xml

9.自定义验证器

(1)普通的验证器继承 ValidatorSupport 类,字段验证程序继承 FieldValidatorSupport。如需要提供参数,提供 setXxx() 方法,如错误消息要获取验证器类中的属性,提供对应的 getXxx() 方法。

(2)注册验证器类:在类路径根目录下新建 validators.xml ,内容可以参考 default.xml 文件里的配置信息。(验证框架首先在根目录下查找validators.xml文件,找不到则调用默认的验证设置)

(3)正常使用

10.编程式验证:

Struts2提供了一个 Validateable 接口,Action 类可以实现这个接口中的 validate() 方法,在其中编写验证逻辑。ActionSupport 类已经实现了 Validateable 接口。

未完,待续

原文地址:https://www.cnblogs.com/solverpeng/p/5661233.html