zoukankan      html  css  js  c++  java
  • 服务器端输入验证

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

    二、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 接口。

    未完,待续

  • 相关阅读:
    logstash过滤器使用ruby把时间格式转UNIX_MS
    logstash使用“|”切分日志报错:Exception caught while applying mutate filter {:exception=>"Invalid FieldReference: `message[1]`"}
    win10安装FileBeat
    win10安装ELK
    向量组的秩一定是有的吗?
    SCIE与SCI的区别
    安装MIUI+出现无法定位程序输入点 GetDpiForWindow 于动态链接库 USER32.dll上如何解决?
    photoshop反色
    二值图像像素交换
    矩阵翻转
  • 原文地址:https://www.cnblogs.com/solverpeng/p/5661233.html
Copyright © 2011-2022 走看看