由于web的开放性,网络上的所有的浏览者都可以自由使用某个应用,为了防止非法输入进入系统,有必要需要对用户的输入进行校验,其中输入校验又分为客户端校验和服务器端校验,客户端校验主要通过JavaScript代码完成,服务器端校验主要通过在应用中编程实现。这里主要对服务器端校验进行说明一下,Struts2为我们提供了两种服务器端的校验:
下面通过用户注册简单说明一下如何利用Struts2为我们提供的校验,注册界面如下所示:
注册界面所对应的register.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ taglib uri="/struts-tags" prefix="s" %> <!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>登录页面</title> </head> <body> <s:fielderror /> <form action="${pageContext.request.contextPath}/user/user_addUser" method="post"> 用户名:<input type="text" name="username" /><br /> 密码:<input type="password" name="password1" /><br /> 确认密码:<input type="password" name="password2" /><br /> <input type="submit" value="确认"/> </form> </body> </html>
<s:fielderror/>标签的作用:一旦发现校验失败,就把校验失败的提示通过addFieldError方法添加进系统的fieldError中,然后通过输入界面提示错误的信息,以便用户更好的进行输入。
1、手动输入校验:
1)对Action中的所有方法进行校验
通过重写validate() 方法实现, validate()方法会校验action中所有与execute方法签名相同的方法。当某个数据校验失败时,我们应该调用addFieldError()方法往系统的fieldErrors添加校验失败信息(为了使用addFieldError()方法,action可以继承ActionSupport ),如果系统的fieldErrors包含失败信息,struts2会将请求转发到名为input的result。在input视图中可以通过<s:fielderror/>显示失败信息。
package com.struts.action; import java.util.regex.Pattern; import com.opensymphony.xwork2.ActionSupport; public class UserRegisterValidateAction extends ActionSupport { private String username; private String password1; private String password2; public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getPassword1() { return password1; } public void setPassword1(String password1) { this.password1 = password1; } public String getPassword2() { return password2; } public void setPassword2(String password2) { this.password2 = password2; } public String addUser() { return "success"; } public String updateUser() { return "success"; } @Override public void validate() { if (this.username == null || "".equals(this.username.trim())) { this.addFieldError("username", "用户名不能为空!"); return; } if (password1 != null && !Pattern.matches("^[A-Za-z0-9]+$", password1.trim())) { this.addFieldError("password1", "密码不能为空,且必须是字母和数字!"); return; } if (password2 != null && !Pattern.matches("^[A-Za-z0-9]+$", password2.trim())) { this.addFieldError("password2", "确认密码不能为空,且必须是字母和数字!"); return; } if (!password1.equals(password2)) { this.addFieldError("password2", "确认密码与密码不一致!"); return; } } }
上面的UserRegisterValidateAction类有addUser()和updateUser()两种方法,并在validate()方法中对用户名和密码进行了校验
配置文件:
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN" "http://struts.apache.org/dtds/struts-2.3.dtd"> <struts> <package name="user" namespace="/user" extends="struts-default"> <action name="user_*" class="com.struts.action.UserRegisterValidateAction" method="{1}"> <result name="input">/register.jsp</result> <result name="success">/WEB-INF/pages/success.jsp</result> </action> </package> </struts>
当我们在注册界面没有输入任何信息时点击确认按钮时,界面提示信息如下:
当我们在注册界面输入用户名,但是没有输入密码与确认密码时,界面提示信息如下:
当我们在注册界面输入用户名与密码,但是没有输入确认密码时,界面提示信息如下:
当我们在注册界面输入用户名与密码与确认密码,但是密码与确认密码不一致时,界面提示信息如下:
当我们在注册界面输入用户名与密码与确认密码,并且密码与确认密码一致,界面跳转到注册成功页面:
注册成功页面success.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!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>注册成功界面</title> </head> <body> 注册成功! </body> </html>
注意:如果输入的参数类型转换失败,也会返回input逻辑视图,实际上,即使是类型转换失败,系统一样会执行validate()方法进行数据校验
如果把注册页面的action改为提交到updateUser,则当用户输入的数据不符合校验规则时显示的提示信息与addUser是一模一样的,这里不在赘述
2)对Action中的指定方法进行校验
如果只想对UserRegisterValidateAction中的某个方法进行校验,则需提供一个validateXxx()方法,其中Xxx即是Action对应的处理逻辑方法,下面对UserRegisterValidateAction中的updateUser()进行校验,添加validateUpdateUser()方法后,修改后的UserRegisterValidateAction如下:
package com.struts.action; import java.util.regex.Pattern; import com.opensymphony.xwork2.ActionSupport; public class UserRegisterValidateAction extends ActionSupport { private String username; private String password1; private String password2; public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getPassword1() { return password1; } public void setPassword1(String password1) { this.password1 = password1; } public String getPassword2() { return password2; } public void setPassword2(String password2) { this.password2 = password2; } public String addUser() { return "success"; } public String updateUser() { return "success"; } public void validateUpdateUser() { if (this.username == null || "".equals(this.username.trim())) { this.addFieldError("username", "用户名不能为空!"); return; } if (password1 != null && !Pattern.matches("^[A-Za-z0-9]+$", password1.trim())) { this.addFieldError("password1", "密码不能为空,且必须是字母和数字!"); return; } if (password2 != null && !Pattern.matches("^[A-Za-z0-9]+$", password2.trim())) { this.addFieldError("password2", "确认密码不能为空,且必须是字母和数字!"); return; } if (!password1.equals(password2)) { this.addFieldError("password2", "确认密码与密码不一致!"); return; } } }
因为此时注册页面请求的Action所对应的方法是addUser(),所以此时当在注册页面没有输入任何信息时,也会跳转到注册成功界面
注意:如果Action中validate()方法与validateXxx()方法同时存在,则这2个方法同时都会起作用,并且validateXxx()会首先被调用
2、基于xml配置的输入校验:
1)对Action中的所有方法进行校验
使用基于xml配置方式实现输入校验时,Action也需要继承ActionSupport类,此时的UserRegisterValidateAction为:
package com.struts.action; import java.util.regex.Pattern; import com.opensymphony.xwork2.ActionSupport; public class UserRegisterValidateAction extends ActionSupport { private String username; private String password1; private String password2; public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getPassword1() { return password1; } public void setPassword1(String password1) { this.password1 = password1; } public String getPassword2() { return password2; } public void setPassword2(String password2) { this.password2 = password2; } public String addUser() { return "success"; } public String updateUser() { return "success"; } }
此外还需提供校验文件,校验和action放在同一个包下
文件的取名格式为:ActionClassName--validation.xml,其中ActionClassName为action的类名,可以改变,后面的-validate.xml部分是固定写法,如此处的文件名就应该为UserRegisterValidateAction-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="username"> <field-validator type="requiredstring"> <param name="trim">true</param> <message>用户名不能为空</message> </field-validator> </field> <field name="password1"> <field-validator type="requiredstring"> <message>密码不能为空</message> </field-validator> <field-validator type="regex"> <param name="expression"><![CDATA[^[A-Za-z0-9]+$]]></param> <message>密码格式不正确,必须是字母和数字的组合</message> </field-validator> </field> <field name="password2"> <field-validator type="requiredstring"> <message>确认密码不能为空</message> </field-validator> <field-validator type="regex"> <param name="expression"><![CDATA[^[A-Za-z0-9]+$]]></param> <message>密码格式不正确,必须是字母和数字的组合</message> </field-validator> </field> <field name="password2"> <field-validator type="fieldexpression"> <param name="expression">password1==password2</param> <message>两次密码不一致</message> </field-validator> </field> </validators>
校验文件的模板可以在struts-2.x.x--apps--struts2-blank.war--WEB-INF--classes--example中找到
<field>指定action中要校验的属性,<field-validator>指定校验器,上面指定的校验器requiredstring是由系统提供的,系统提供了能满足大部分验证需求的校验器,这些校验器的定义可以在xwork-2.x.jar中的com.opensymphony.xwork2.validator.validators下的default.xml中找到。
则当用户输入的数据不符合校验规则时显示的提示信息与用手动编写代码时的提示信息大致相同,这里不在 赘述
2)对Action中的指定方法进行校验
当校验文件的取名为ActionClassName-validation.xml时,会对 action中的所有处理方法实施输入验证。如果你只需要对action中的某个action方法实施校验,那么,校验文件的取名应为:ActionClassName-ActionName-validation.xml,其中ActionName为struts.xml中action的名称。
对UserRegisterValidateAction中的save()方法进行校验,则文件的名称就为:
UserRegisterValidateAction-user_addUser-validation.xml
对update()方法进行校验时,文件的名称就为:
UserRegisterValidateAction-user_updateUser-validation.xml
而校验文件的内容与 UserRegisterValidateAction-validation.xml相同,文件存放在与需要校验的action的同一包下。
基于xml配置输入校验的特点:
当为同一个action提供了ActionClassName-validation.xml和ActionClassName-ActionClassName-validation.xml两种校验文件时,系统按下面的顺序寻找校验文件:
1、ActionClassName-validation.xml
2、ActionClassName-ActionClassName-validation.xml
系统寻找到第一个文件时,还会继续搜索后面的校验文件,当搜索完所有的校验文件时,会把校验文件的所有校验规则进行综合,然后全部应用于action方法的校验,如果两个校验文件中的校验规则发生冲突,则只使用后面校验文件的校验规则。
当action继承了另一个action,则父类action的校验文件会先被搜索到。
Struts2的输入校验流程:
1、类型转换器对请求参数执行类型转换,并把转换后的值设置成Action的属性值
2、如果在执行转换的过程中出现异常,系统会将异常的信息保存到ActionContext中,conversionError拦截器负责将其封装到fieldError里,然后执行第3步,如果转换过程没有出现异常,则直接进入第3步
3、系统通过反射技术调用validateXxx()方法,其中Xxx是即将处理用户请求的处理逻辑所对应的方法名
4、调用Action类里的validate()方法
5、经过上面的4个步骤之后,如果都没有出现fieldError,将调用Action里处理用户请求的处理方法,如果fieldError中存在错误信息,系统将转入input逻辑视图所指定的视图资源
相关推荐
XWork的拦截器(Interceptor)机制在Struts2中扮演了关键角色,允许开发者定义一系列在Action执行前后运行的代码片段,用于日志记录、权限检查、数据校验等操作。 Struts2的MVC设计模式使得开发者可以清晰地分离...
在这个名为"struts2-login校验.rar"的压缩包中,我们很显然会看到一个关于Struts2登录验证的实现,涉及到admin和user两个不同角色的登录页面。 首先,我们需要了解Struts2的核心概念,如Action和Result。Action是...
### Struts2输入校验深度解析 #### 一、手动输入完成校验 在Struts2框架中,输入校验是确保数据完整性和安全性的重要环节。对于手动输入完成校验,Struts2提供了灵活的机制。 1. **普通处理方式**:在Action类中...
在Struts2中,校验器(Validator)是处理用户输入验证的核心组件,确保提交到服务器的数据符合预设的业务规则。这篇博客文章可能是关于如何使用Struts2的内置校验机制以及自定义校验规则的探讨。 Struts2的校验框架...
在Struts2中,输入校验器是一种实现数据验证的组件,它们通过配置在XML文件(如`default.xml`)中来定义,并与Action类的属性关联。`default.xml`文件通常位于`com/opensymphony/xwork2/validator/validators`路径下...
本文将深入探讨Struts2中的输入校验机制,以及如何对指定方法进行输入校验。 在Struts2中,输入校验通常分为两种方式:客户端校验和服务器端校验。客户端校验主要通过JavaScript在用户端进行,可以提供即时反馈,但...
在Struts2中,输入校验是确保数据安全、准确和有效的重要环节。本篇文章将深入探讨Struts2的输入校验机制及其相关知识点。 **输入校验的重要性** 输入校验是Web应用开发中的关键步骤,它可以防止恶意用户提交无效或...
- **表单验证**:利用Struts 2的内置验证机制,对用户输入进行校验。 - **国际化与本地化**:如何让应用支持多语言,实现动态切换。 - **标签库的使用**:掌握Struts 2提供的各种标签,提高视图层的开发效率。 - **...
10. **数据校验**:Struts 2提供了强大的表单数据验证功能,可以通过XML或注解定义验证规则,可以进行客户端和服务器端的数据校验,确保输入数据的正确性。 综上所述,Struts 2.3.15作为一个成熟的Web开发框架,...
《Struts2环境下的Jcaptcha4Struts2验证码组件详解》 在Web开发中,验证码是一种常见的安全机制,用于防止自动化的恶意攻击,如机器人填写表单或进行非法操作。Struts2作为Java Web开发中广泛应用的MVC框架,与...
struts2的输入校验有两种方式: 一.重写validate()方式 二.采用配置文件的方式 先我们就以一个简单的登录的例子来讲解这个吧. 重点讲解下,第二个采用配置文件的方式: 1.添加一个xml的校验文件,保存在...
本文将深入探讨Struts2中的输入校验机制,帮助开发者更好地理解和应用。 一、Struts2输入校验概述 在Struts2中,输入校验主要用于验证用户通过表单提交的数据,防止无效或恶意数据进入系统。Struts2提供了多种方式...
- 对输入数据进行严格的校验,防范XSS、CSRF等攻击。 - 结合Spring等其他框架,提升应用的灵活性和可维护性。 6. **集成与测试**: Struts2可以轻松地与其他Java EE组件,如Spring、Hibernate等进行集成。在测试...
该插件是Struts2生态的一部分,帮助开发者在处理数字输入时进行格式化和校验,提高应用的用户体验和数据安全性。 首先,让我们了解一下Struts2的工作原理。Struts2的核心组件包括Action、Result、Interceptor(拦截...
Struts2是一个流行的Java web开发框架,它提供了一套强大的输入校验机制,确保用户提交的数据符合业务逻辑的要求。在本文中,我们将深入探讨Struts2的输入校验功能,包括手动输入校验和基于验证框架的输入校验。 ##...
同时,开发者应该使用最新的 Struts2 版本,并遵守安全编码实践,例如输入验证、数据编码和错误处理等。 Struts2 S2-029 远程代码执行漏洞是一个严重的安全漏洞,需要开发者和运维人员高度警惕,遵守安全编码实践,...