您的位置:首页 > 编程语言 > Java开发

坠落凡间的struts2(4)---数据的校验

2013-09-30 16:04 344 查看

数据校验的意义

WEB数据收集的复杂性

客户数据输入的误操作

其他恶意攻击

struts2数据校验的方法

客户端校验和服务端校验。
客户端校验是指,在HTML画面上自动生成JavaScript校验代码,在用户提交到服务器之前在客户端浏览器中进行校验。默认位客户端校验。
服务端校验是指,在数据提交到服务器上之后,在Action处理之前,对客户但提交的数据进行校验。
struts2校验分为:
Java Annotation配置
XML配置文件配置
ActionSupport实现了Validatable接口,这个接口中定义了一个validate方法,通过重写validate方法可以完成更详细的校验

validate方法验证:

package org.senssic.action;
import com.opensymphony.xwork2.ActionSupport;
public class ValidationC extends ActionSupport {
private static final long serialVersionUID = 1L;
private String name;
private int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String execute() {
return SUCCESS;
}
@Override
public void validate() {
if ("".equals(name.trim()) || name == null) {
addFieldError("name", "姓名输入错误!");
}
if (age <= 0 || age > 100) {
addFieldError("age", "年龄输入错误!");
}
}
}

jsp如果要显示错误信息需要添加struts的标签<filederror/>:

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
    <%@taglib prefix="s" uri="/struts-tags" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
  <s:fielderror></s:fielderror>
   <s:form action="ValidationC" >
      姓名:<s:textfield name="name"></s:textfield>
      年龄:<s:textfield name="age"></s:textfield>
     <s:submit>提交</s:submit>
   </s:form>
</body>
</html>


validate多业务action方法的验证:

如果业务验证方法不止一个则可以使用validateXXX(){}来验证,在struts.xml配置方法调用

<action name="ValidationC" class="org.senssic.action.ValidationC" method="test">
           <result name="input">/page/login.jsp</result>
              <result>/page/welcome.jsp</result>
           </action>


package org.senssic.action;

import com.opensymphony.xwork2.ActionSupport;

public class ValidationC extends ActionSupport {
	private static final long serialVersionUID = 1L;
	private String name;
	private int age;

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public int getAge() {
		return age;
	}

	public void setAge(int age) {
		this.age = age;
	}

	@Override
	public String execute() {

		return SUCCESS;
	}

	@Override
	public void validate() {
		if ("".equals(name.trim()) || name == null) {
			addFieldError("name", "姓名输入错误!");
		}
		if (age <= 0 || age > 100) {
			addFieldError("age", "年龄输入错误!");
		}
		System.out.println("validate方法验证了");

	}

	public String test() {
		System.out.println("test的业务");
		return SUCCESS;
	}

	public void validateTest() {
		System.out.println("validateXXX方法验证了,是test业务的验证。");
	}

}


执行顺序为:



运行结果:

validateXXX方法验证了,是test业务的验证。

validate方法验证了

test的业务

Java
通过Annotation校验:

import
com.opensymphony.xwork2.validator.annotations包提供了一些必要的Annotation用来配置校验信息。

这些内容包括:

枚举类型

ValidatorType

Field 校验字段

Simple 校验其他

Annotation(标注)类型

Validation

用来标记一个类需要被校验

ConversionErrorFieldValidator

字段转换出错

DateRangeFieldValidator

日期范围校验

DoubleRangeFieldValidator

Double类型范围校验

EmailValidator

Email地址校验

ExpressionValidator

使用一个OGNL表达式的校验,功能非常强大

FieldExpressionValidator

针对一个字段的使用OGNL表达式的校验

IntRangeFieldValidator

Int类型范围校验

RegexFieldValidator

正则表达式校验

RequiredFieldValidator

必填字段校验

RequiredStringValidator

必填String校验,

StringLengthFieldValidator

字符串长度校验

UrlValidator

URL校验

Validations

可以组合上述的各种校验类型以满足更多的需求。

VisitorFieldValidator

可以将Action中的对象的属性的校验方法定位到已经定义的对象原有的校验方法

CustomValidator

ValidationParameter

两个类一起完成自定义的校验

eg:

package org.senssic.action;

import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.validator.annotations.IntRangeFieldValidator;
import com.opensymphony.xwork2.validator.annotations.RequiredFieldValidator;
import com.opensymphony.xwork2.validator.annotations.Validations;
import com.opensymphony.xwork2.validator.annotations.ValidatorType;

@Validations
public class ValidationA extends ActionSupport {
	private String name;
	private int age;

	public int getAge() {
		return age;
	}

	@RequiredFieldValidator(shortCircuit = true, type = ValidatorType.FIELD, message = "年龄必须填写")
	@IntRangeFieldValidator(min = "1", max = "100", type = ValidatorType.FIELD, shortCircuit = true, message = "年龄必须在0~100之间")
	public void setAge(int age) {
		this.age = age;
	}

	@Override
	public String execute() {
		return SUCCESS;
	}

	public String getName() {
		return name;
	}

	@RequiredFieldValidator(shortCircuit = true, type = ValidatorType.FIELD, message = "姓名为必须填写项")
	public void setName(String name) {
		this.name = name;
	}

}


java通过xml校验:

采用字段校验:

acttion代码:

package org.senssic.action;

import com.opensymphony.xwork2.ActionSupport;

public class XmlValidate extends ActionSupport {
	private static final long serialVersionUID = 1L;
	private String name;
	private int age;

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public int getAge() {
		return age;
	}

	public void setAge(int age) {
		this.age = age;
	}

	@Override
	public String execute() {
		return SUCCESS;
	}

}


xml校验代码(xml位于同包下且命名为:actionname-validation.xml,对某个action的输入校验):

<?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="name">
  		   <field-validator type="requiredstring">
  		      <message>name为必须填写项</message>
  		   </field-validator>
  		 </field>
  		 <field name="age">
  		 <field-validator type="required">
  		    <message>年龄为必填项</message>
  		 </field-validator>
  		    <field-validator type="int">
  		      <param name="min">1</param>
  		      <param name="max">100</param>
  		      <message>年龄必须在1~100之间</message>
  		    </field-validator>
  		 </field>
  		</validators>


其中字段<field-validator type=""/>中的type在对应的xwork-core.jar的com.opensymphony.xwork2.validator.validators包下的default.xml

而对应的属性名字为相应类中的属性值(例如age的校验)





采用非字段校验:

<?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>
<validator type="requiredstring">
<param name="fieldName">name</param>
<message>name为必须填写项</message>
</validator>
<validator type="int">
<param name="fieldName">age</param>
<param name="min">1</param>
<param name="max">100</param>
<message>年龄必须在1~100之间</message>
</validator>
<validator type="required">
<param name="fieldName">age</param>
<message>年龄不能为空</message>
</validator>
</validators>


struts2多业务方法xml校验:

1、Action级别校验命名格式:

ActionClassName-validation.xml

同上

2、Action中某个方法的校验命名格式:

ActionClassName-ActionAliasName-validation.xml

注意:这里的ActionAliasName(action别名)指的是struts.xml中Action name="XX"的xx的名称,而不是method="XX"的名称

 <action name="ValidationC" class="org.senssic.action.ValidationC" method="test">
           <result name="input">/page/login.jsp</result>
              <result>/page/welcome.jsp</result>
           </action>

对这个业务方法验证即为:

ValidationC-ValidationC-validation.xml

短路校验器:

校验的顺序:如果以上2个校验文件都存在,那么2个文件都会被执行;如果2个校验文件中的校验属性相同那么将被执行同校验属性中ActionClassName-ActionAliasName-validation.xml中的校验规则。首先Validator,其次Field
Validator,但是在Validator或者Field Validator执行的过程中,顺序按照xml文件中的定义。短路的意思是,一旦一个短路的校验出错,其余后续的校验将不再进行。

内建校验器:

required (必填校验器,要求field的值不能为null)

requiredstring (必填字符串校验器,要求field的值不能为null,并且长度大于0,默认情况下会对字符串去前后空格)

stringlength(字符串长度校验器,要求field的值必须在指定的范围内,否则校验失败,minLength参数指定最小长度,maxLength参数指定最大长度,trim参数指定校验field之前是否去除字符串前后的空格)

regex(正则表达式校验器,检查被校验的field是否匹配一个正则表达式.expression参数指定正则表达式,caseSensitive参数指定进行正则表达式匹配时,是否区分大小写,默认值为true)

int(整数校验器,要求field的整数值必须在指定范围内,min指定最小值,max指定最大值)

double(双精度浮点数校验器,要求field的双精度浮点数必须在指定范围内,min指定最小值,max指定最大值)

fieldexpression(字段OGNL表达式校验器,要求field满足一个ognl表达式,expression参数指定ognl表达式,该逻辑表达式基于ValueStack进行求值,返回true时校验通过,否则不通过)

email(邮件地址校验器,要求如果field的值非空,则必须是合法的邮件地址)

url(网址校验器,要求如果field的值非空,则必须是合法的url地址)

date(日期校验器,要求field的日期值必须在指定范围内,min指定最小值,max指定最大值)

conversion(转换校验器,指定在类型转换失败时,提示的错误信息)

visitor(用于校验action中的复合属性,它指定一个校验文件用于校验复合属性中的属性)

expression(OGNL表达式校验器,expression参数指定ognl表达式,该逻辑表达式基于ValueStack进行求值,返回true时校验通过,否则不通过,该校验器不可用在字段校验器风格的配置中)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: