参数合法性校验

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了参数合法性校验相关的知识,希望对你有一定的参考价值。

参考技术A

Assert断言是最常见的一种校验,可以用在Controller、service、包括Junit测试等等任何需要的地方。常用的Assert包括notNull、notEmpty针对集合、hasLength、isTrue( 万能方法——任何自定义逻辑判断都可以使用 )、doesNotContain等。

在需要校验的地方手动调用校验Util类,该类会抛出 IllegalArgumentException 参数异常,全局异常处理类( GlobalExceptionHandler )捕获后包装返回json信息。

修改这2个参数为合法范围

再次访问,校验通过

多数情况下采用第三种进行处理,如果某些场景的校验更严苛可以使用第四种或结合Assert。
对复杂的校验规则,可以自定义校验注解,参考: 这篇文章链接 。

Struts2请求参数合法性校验机制

 在Action中通过代码执行数据校验

请求参数的输入校验途径一般分两种:客户端校验 :通过JavaScript 完成 (jquery validation插件),目的:过滤正常用户的误操作。

服务器校验 :通过java代码完成 ,目的:整个应用阻止非法数据的最后防线

列如:

<h1>登录:请求数据校验--代码手动校验</h1>
    <s:fielderror/>
    <form action="${pageContext.request.contextPath }/login.action" method="post">
        用户名:<input type="text" name="username"/><s:fielderror fieldName="username" /><br/>
        密    码:<input type="password" name="password"/><br/>
        <input type="submit" value="登录"/>
    </form>

1.全局校验 (对当前Action的所有方法进行校验 )

如果要执行校验 ,Action必须继承ActionSupport 类 (因为它实现 Validateable接口

 

//手动校验
public void validate() {
//StringUtils.isBlank()方法判断输入是否为空
    if(StringUtils.isBlank(username)){
  /*将错误信息写入Map<String,List<String>> fieldErrors;
    当遇到workflow拦截器时,会判断错误集合的size的大于0,
    如果大于0,则向input的视图跳转*/
    super.addFieldError("username", "用户不能为空");
      }
}

StringUtils 方法的操作对象是 java.lang.String 类型的对象,是 JDK 提供的 String 类型操作方法的补充,并且是 null 安全的(即如果输入参数
String 为 null则不会抛出 NullPointerException ,而是做了相应处理。

JSP显示错误信息
配置Struts2的特有标签S标签

在jsp增加显示错误信息 <s:fielderror />

校验机制原理分析:

2.局部校验 (校验Action中指定业务方法—校验一个方法 )

 在Action 添加 validateXxx 方法(约定), 这里XXX 是要校验目标方法名 (只会对指定方法校验)

提示:

1.被校验方法首字母 要大写。

2.全局校验一直会执行,即使有局部校验。且先走的局部校验。

-----------------------------------------------------------------------------------------------------------------------------

 基于XML配置实现校验

 

 

1.  全局校验 (校验当前Action 所有方法-是针对某一个action中的所有方法)----在Action类所在包,创建 Action类名-validation.xml

JSP页面同上

Action代码: Action 必须继承ActionSupport 类 (为了实现 Validateable接口 )

 

public class LoginAction extends ActionSupport {
    private static final long serialVersionUID = 1L;
    private String username;
    private String password;
    public String getUsername() {
        return username;
    }
    public void setUsername(String username) {
        this.username = username;
    }
    public String getPassword() {
        return password;
    }
    public void setPassword(String password) {
        this.password = password;
    }

    public String execute() throws Exception {
        System.out.println(this);
        return INPUT;
    }
    @Override
    public String toString() {
        return "LoginAction [username=" + username + ", password=" + password
                + "]";
    }
    

 

XML代码:(必须和 action在容一个包下Action类名-validation.xml

<!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">
     <field-validator type="requiredstring">
       <message>用户不能为空</message>
     </field-validator>
   </field>
   <!-- 校验密码 -->
   <field name="password">
     <field-validator type="requiredstring">
       <message>密码不能为空</message>
     </field-validator>
   </field>
 </validators>

 局部校验 (校验当前Action 指定方法

在Action类所在包,创建 Action类名-<action>name属性-validation.xml

JSP页面代码:

 

<h1>登录:请求数据校验--xml配置校验--局部</h1>
    <s:fielderror/>
    <form action="${pageContext.request.contextPath }/login3.action" method="post">
        用户名:<input type="text" name="username"/>(非空,且长度为3-10位)<br/>
        密    码:<input type="password" name="password"/>(必须,且长度为6-12)<br/>
        重复密码:<input type="password" name="repassword"/>(必须和密码一致)<br/>
        年龄:<input type="text" name="age"/>(数字,且必须是18-100)<br/>
        手机号码:<input type="text" name="mobile"/>(手机号规则,11位数字)<br/>
        邮箱:<input type="text" name="email"/>(邮箱格式)<br/>
        <input type="submit" value="登录"/>
    </form>

 

Action代码:

 

public class User2Action extends ActionSupport{
    private static final long serialVersionUID = 1L;
    private String username;
    private String password;
    private String repassword;
    private int age;
    private String mobile;
    private String email;
    
    public String login2(){
        System.out.println(this);
        return NONE;
    }
/*

       GET和SET 方法略去...............
       toString方法略去..................

*/

XML代码:

<!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">
        <field-validator type="stringlength">
            <param name="minLength">3</param>
            <param name="maxLength">10</param>
            <message>用户名必须在3-10位</message>
        </field-validator>
    </field>
    <field name="password">
        <field-validator type="stringlength">
            <param name="minLength">6</param>
            <param name="maxLength">12</param>
            <message>密码必须在6-12位</message>
        </field-validator>
    </field>
    <field name="repassword">
        <field-validator type="fieldexpression">
            <param name="expression">password==repassword</param>
            <message>两次输入密码不一致</message>
        </field-validator>
    </field>
    <field name="age">
        <field-validator type="int">
            <param name="min">18</param>
            <param name="max">100</param>
            <message>年龄必须是18-100</message>
        </field-validator>
    </field>
    <field name="mobile">
        <field-validator type="regex">
            <param name="regex"><![CDATA[^1[3|5|8|4]\\d{9}$]]></param>
            <message>用户名必须在3-10位</message>
        </field-validator>
    </field>
    <field name="email">
        <field-validator type="email">
            <message>邮箱格式不正确</message>
        </field-validator>
    </field>
</validators>

 

如果检测错误Action会自动跳转到input视图。

其他校验器可参考:

以上是关于参数合法性校验的主要内容,如果未能解决你的问题,请参考以下文章

国内5G imei合法性校验?

PHP校验日期格式是否合法

优雅的方式来校验spring-boot的form表单参数和json的body参数合法性验证方式

API安全-参数校验

Mongoose 校验参数

自学有感9