数据校验

数据校验分为客户端校验和服务端校验
客户端校验
-主要是通过页面的脚本验证,仅能对数据进行初步过滤
-开发者必须为每个表单书写大量的客户端校验代码
-用户可通过其他方式绕过验证,如将页面另存为本地网页后进行脚本-修改后提交
-将大部分输入错误阻止在客户端,减轻了服务器负担

服务端校验
-服务端数据校验在服务器端进行
-服务端数据校验是整个应用的最后防线,阻止非法数据进入系统,对-系统的安全性,完整性承载着不可替代的作用。

传统的客户端验证(不安全但效率高):

 <script>
    function $(id){
        return document.getElementById(id);
    }
    function validateForm(){
        var name=$("username").value;
        var namemsg=$("usernamemsg");
        namemsg.innerHTML="";
        if(name==""){
            namemsg.innerHTML="用户名不能为空";
            return false;
        }
        return true;
    }

  </script>

  <body>
    <form action="user/userAction!save" method="post" onsubmit="return validateForm();">

     用户名:<input type="text" name="name"  id="username"><span id="usernamemsg"></span> <br/>
            密码:<input type="password" name="password" id="password" ><br/>
            电话号码:<input type="text" name="phone"  > <br/>

    <input type="submit" value="保存 "> 
      <input type="button" value="返回 " onclick="history.go(-1)"> 
    </form>
  </body>

为了安全,加一个服务器端验证(增加了服务器的压力但是安全),校验在服务器端进行 方法一之整体验证
UserAction继承了ActionSupport类,重写ActionSupport类中的validate()方法便可实现编码校验。有两种方法,addActionError和addFieldError,后者更常用。此处的方法和jsp文件中struts标签对应的方法相同。addactionerror是在jsp用了标签的地方全部错误都会显示,addfielderror是按照key单独显示。

    @Override
    public void validate() {
        if(model.getName()==null||"".equals(model.getName())){
            //如果有空,不让它调用方法,提示错误信息
            this.addActionError("用户名不能为空1。。。");
            this.addFieldError("username", "用户名不能为空2");

        }
        if(model.getPassword()==null||"".equals(model.getPassword())){
            this.addActionError("密码不能为空1。。。");
            this.addFieldError("password", "用户密码不能为空2");
        }
    }

再在相应的jsp中加入struts标签

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@taglib uri="/struts-tags" prefix="s"%>

在form表单中使用标签

    <form action="user/userAction!save" method="post" onsubmit="return validateForm();">

     用户名:<input type="text" name="name"  id="username"><s:actionerror/><s:fielderror fieldName="username"></s:fielderror><span id="usernamemsg"></span> <br/>
            密码:<input type="password" name="password" id="password" ><s:fielderror fieldName="password"></s:fielderror><br/>
            电话号码:<input type="text" name="phone"  > <br/>

    <input type="submit" value="保存 "> 
      <input type="button" value="返回 " onclick="history.go(-1)"> 
    </form>

struts.xml配置文件中加入input返回方法

    <package name="userModel" extends="struts-default" namespace="/user">
        <action name="userAction" class="com.nic.action.UserAction">
            <result name="input">/user/user.jsp</result>

这里写图片描述

在jsp文件中s标签对应的方法,是在action文件中validate中对应的方法,具体的工作流程如下:

校验流程:

1、类型转换器负责请求参数的类型转换,并将这些值设置成Action的属性值。

2、在类型转换中如果出现异常,将异常保存到ActionContext中,conversionError拦截器负责将其 封装到fieldError中,然后执行3,如无异常,直接进入3。

3、通过反射调用validatorXxx方法,Xxx代表处理用户请求的业务逻辑的方法名。

4、调用Action类的validator方法。

5、如果以上没有出现fieldError,则调用Action的业务处理方法,如有fieldError错误,转入input 逻辑视图所指定的视图资源

方法一之局部验证:
在action里面写需要防守的方法,方法名为validate+方法名

    public void validateSave() {
        if(model.getName()==null||"".equals(model.getName())){
            //如果有空,不让它调用方法,提示错误信息
            this.addActionError("用户名不能为空1。。。");
            this.addFieldError("username", "用户名不能为空2");

        }
        if(model.getPassword()==null||"".equals(model.getPassword())){
            this.addActionError("密码不能为空1。。。");
            this.addFieldError("password", "用户密码不能为空2");
        }
    }

如果两个方法都用了,那么就先方法二(局部)再方法一(整体)

如果不想某个方法被验证,除了用方法二,还可以在方法名前加@SkipValidation

    @SkipValidation
    public String query(){
        System.out.println("query...");
        list=service.query(model);
        return "list";
    }

方法二:配置文件验证
新建一个xml配置文件
要写在需要验证的action类中的同一个包中,命名方式:相应的类+-+validation。例如UserAction,那么配置文件为UserAction-validation.xml.

UserAction-validation.xml:

<?xml version="1.0" encoding="UTF-8"?>
<!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="name">
        <field-validator type="requiredstring">
            <param name="trim">true</param>
            <message>用户名不能为空【第二种方式:配置文件】</message>
        </field-validator>

        <field-validator type="stringlength">
            <param name="minLength">3</param>
            <param name="maxLength">6</param>
            <message>用户名只能3-6位【第二种方式:配置文件】</message>
        </field-validator>
    </field>

    <field name="phone">
        <field-validator type="stringlength">
            <param name="minLength">11</param>
            <param name="maxLength">11</param>
            <message>电话号码只能11位【第二种方式:配置文件】</message>
        </field-validator>
    </field>

</validators>   

参考xwork-core包中xwork-default.xml文件。
配置文件也可作局部配置。比如save方法验证,UserActionSave-validation.xml就只验证save方法,类似方法一。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值