输入校验的概念
输入校验,从字面上来看好像是指对如输入的密码或者用户名输入错误的校验。其实这个不算输入校验,这个算是业务逻辑的判断了。输入校验是对输入的用户名长度、密码长度、年龄信息等的判断。
输入校验的必要性
所有用户的输入都是邪恶的,为了保证数据的合法性,输入校验就显得尤为重要。
校验的方式
输入校验分为客户端校验和服务器端校验。
----客户端校验可以过滤掉用户的错误操作,是第一道防线,一般使用JavaScript代码实现。
----仅有客户端验证还是不够的。攻击者还可以绕过客户端校验直接进行非法输入,这样可能会引起系统的异常,为了确保数据的合法性,防止用户通过非正常手段提交错误信息。所以必须加上服务器端的验证。
----客户端校验可以过滤掉用户的错误操作,是第一道防线,一般使用JavaScript代码实现。
----仅有客户端验证还是不够的。攻击者还可以绕过客户端校验直接进行非法输入,这样可能会引起系统的异常,为了确保数据的合法性,防止用户通过非正常手段提交错误信息。所以必须加上服务器端的验证。
客户端校验
用JavaScript进行客户端校验:
----编写校验方法
----在提交表单的事件中调用校验方法校验
----根据校验方法来判断是否进行表单提交
----编写校验方法
----在提交表单的事件中调用校验方法校验
----根据校验方法来判断是否进行表单提交
服务器端校验
服务器端校验对于系统的安全性、完整性、健壮性起到了至关重要的作用。
Struts 2框架是非常强大的,它提供了一套验证框架,通过验证框架能够非常简单和快速地完成输入校验。
Struts2 主要通过验证框架来完成数据验证。
Action必须继承ActionSupport类。
对于输入校验struts2提供了两种实现方法:
1. 采用手工编写代码实现。(手工编程)
2. 基于XML配置方式实现。(Struts2校验框架)
在struts2中,我们可以实现对action的所有方法进行校验或者对action的指定方法进行校验。
手动校验编程
- 手动编程方式:主要是通过在类中编写校验逻辑代码。
- 手动编程方式
方式二:重写validateXxx()方法:validateXxx()只会校验action中方法名为Xxx的方法。
重写validate()方法
- validate()方法会校验action中所有与execute方法签名相同的方法。
- 当某个数据校验失败时,我们应该调用addFieldError()方法往系统的fieldErrors添加校验失败信息(为了使用addFieldError()方法,action可以继承ActionSupport )
- 如果系统的fieldErrors包含失败信息,struts2会将请求转发到名为input的result。在input视图中可以通过<s:fielderror/>显示失败信息。
public void validate() {
if(username.trim().equals("") || username==null)
{
this.addFieldError("username", "用户名不能为空");
}
if(password.trim().equals("") || password==null)
{
this.addFieldError("password", "密码不能为空");
}else
{
if(password.length()<6 || password.length()>12)
{
this.addFieldError("password", "密码的长度在6--12位之间");
}
}
}
<constant name="struts.devMode" value="true" />
<package name="val" namespace="/val" extends="struts-default">
<action name="val_*" class="com.nuesoft.validate.LoginAction“
method="{1}">
<result name="message">/index.jsp</result>
<result name="input">/login.jsp</result>
</action>
</package>
- Action类继承ActionSupport类,struts.xml中添加input的result视图。
- 验证失败后,请求转发至input视图
重写validateXxx()方法
- 通过validateXxx()方法实现, validateXxx()只会校验action中方法名为Xxx的方法。其中Xxx的第一个字母要大写。
- 当某个数据校验失败时,我们应该调用addFieldError()方法往系统的fieldErrors添加校验失败信息(为了使用addFieldError()方法,action可以继承ActionSupport )。
- 如果系统的fieldErrors包含失败信息,struts2会将请求转发到名为input的result。在input视图中可以通过<s:fielderror/>显示失败信息。
public void validateUpdate() { //对某个特定的方法进行验证 if(username.trim().equals("") || username==null) { this.addFieldError("username", "用户名不能为空"); } if(password.trim().equals("") || password==null) { this.addFieldError("password", "密码不能为空"); }else { if(password.length()<6 || password.length()>12) {
<constant name="struts.devMode" value="true" /> <package name="val" namespace="/val" extends="struts-default"> <action name="val_*" class="com.nuesoft.validate.LoginAction“ method="{1}"> <result name="message">/index.jsp</result> <result name="input">/login.jsp</result> </action> </package>
this.addFieldError("password", "密码的长度在6--12位之间");}}}
- Action类继承ActionSupport类,struts.xml中添加input的result视图,
- 验证失败后,请求转发至input视图
输入校验的流程
- 类型转换器对请求参数执行类型转换,并把转换后的值赋给action中的属性。
- 如果在执行类型转换的过程中出现异常,系统会将异常信息保存到ActionContext,conversionError拦截器将异常信息添加到fieldErrors里。不管类型转换是否出现异常,都会进入第3步。
- 系统通过反射技术先调用action中的validateXxx()方法,Xxx为方法名。
- 再调用action中的validate()方法。
- 经过上面4步,如果系统中的fieldErrors存在错误信息(即存放错误信息的集合的size大于0),系统自动将请求转发至名称为input的视图。如果系统中的fieldErrors没有任何错误信息,系统将执行action中的处理方法。
校验框架后续补充~