- 浏览: 39293 次
- 性别:
- 来自: 北京
文章分类
最新评论
在Struts中使用Validator实现可配置的信息校验(二)
三、自定义校验逻辑
毕竟Struts提供的校验逻辑有限,不可能满足所有的开发需要,因此有时必须对其进行扩展。这里举一个实际项目中的例子:校验码检查。现在很多网站为了防止恶意的页面刷新攻击,都使用了图片形式的校验码,如:
表单提交后需要检查校验码(存在request或session里)和用户输入是否一致,代码如下:
1public class MyValidator{
2 private static Logger logger = Logger.getLogger(Constants.CON_LOGGER_NAME);
3
4 public static boolean validateCodeInput(Object obj,ValidatorAction action,Field field,
5 ActionMessages errors,HttpServletRequest req){
6 String code = (String)req.getSession().getAttribute(Constants.SESSION_CHECKSUM_CODE);
7 String input = ValidatorUtils.getValueAsString(obj,field.getProperty());
8
9 logger.debug("Code: " + code + ", input: " + input);
10 if(code.equalsIgnoreCase(input))
11 return true;
12 else{
13 errors.add(field.getKey(),Resources.getActionMessage(req,action,field));
14 return false;
15 }
16 }
17}
2 private static Logger logger = Logger.getLogger(Constants.CON_LOGGER_NAME);
3
4 public static boolean validateCodeInput(Object obj,ValidatorAction action,Field field,
5 ActionMessages errors,HttpServletRequest req){
6 String code = (String)req.getSession().getAttribute(Constants.SESSION_CHECKSUM_CODE);
7 String input = ValidatorUtils.getValueAsString(obj,field.getProperty());
8
9 logger.debug("Code: " + code + ", input: " + input);
10 if(code.equalsIgnoreCase(input))
11 return true;
12 else{
13 errors.add(field.getKey(),Resources.getActionMessage(req,action,field));
14 return false;
15 }
16 }
17}
注释:
1、第1行:MyValidator没有任何父类,运行时Validator通过reflection生成对象
2、第4行:校验方法可随意命名,通过reflection调用,但参数必须按照规范
3、第6行:从session中取出图片中的字符串
4、第7行:得到用户输入的值,Struts在这里用Field类对表单字段进行了封装,而Field具体封装的字段在validation.xml中定义,见上篇
validator-rules.xml中的定义:
1<validator name="codeinput"
2 classname="consultII.web.utils.MyValidator"
3 method="validateCodeInput"
4 methodParams="java.lang.Object,
5 org.apache.commons.validator.ValidatorAction,
6 org.apache.commons.validator.Field,
7 org.apache.struts.action.ActionMessages,
8 javax.servlet.http.HttpServletRequest"
9 msg="errors.code"/>
10
2 classname="consultII.web.utils.MyValidator"
3 method="validateCodeInput"
4 methodParams="java.lang.Object,
5 org.apache.commons.validator.ValidatorAction,
6 org.apache.commons.validator.Field,
7 org.apache.struts.action.ActionMessages,
8 javax.servlet.http.HttpServletRequest"
9 msg="errors.code"/>
10
validation.xml中的定义:
<field property="input" depends="required,codeinput"/>
<field property="input" depends="required,codeinput"/>
<field property="input" depends="required,codeinput"/>
在servlet中将校验码存入session传递给Validator:
req.getSession().setAttribute(Constants.SESSION_CHECKSUM_CODE,code);
这样就OK了。
四、将校验逻辑转译成JavaScript代码
由于Validator的代码在服务器端被执行,因此如果校验请求频繁的话将会对服务器端造成不小的性能压力。考虑到这个问题,Struts中提供的校验方法可以被转译成JavaScript代码嵌入页面,这样校验将在客户端进行。
使用时,只要在页面中嵌入两条Struts html标签库中的标签:
1<html:javascript formName = "formName" />
2<html:form action = "" onsubmit = "return validateFormName(this);" />
2<html:form action = "" onsubmit = "return validateFormName(this);" />
其中第一行定义了需要转译的FormBean名,这里是“formName”,第二行在该FormBean封装的表单上添加onsubmuit事件,而该事件调用的函数会在JSP请求到客户端时由Validator框架自动生成,命名规则为“validateXXX”,其中“XXX”就是第一行中的formName属性的值,这里是“formName”,因此生成的函数名为“validateFormName”。
关于为自定义的Validator(如上文的MyValidator)创建JS代码,我没有实现过,感兴趣的话可以去Struts官网上找一下相关文档。
发表评论
-
在Java中使用Oracle blob
2005-02-13 22:27 773Oracle中的lob (Large Object)可以存储非 ... -
java.util.StringTokenization
2005-02-13 22:29 642今天室友老七做数据库大作业,其中要实现一个功能,就是输入一个以 ... -
JBuilder 2005中的Servlet mapping
2005-02-13 22:30 698使用JB进行Servlet好像很方便的样子,但是servlet ... -
static与final变量
2005-08-04 12:27 745一、illegal forward refrence 前天写一 ... -
使用策略模式(Strategy)实现多关键字排序
2005-08-04 12:37 791“策略模式”的出现,是为了提供一套相互之间可灵活替换的算法, ... -
Alloy
2005-08-04 13:09 658Alloy look and feel(http:// ... -
IDEA
2005-08-04 13:11 923今天在TSS上看到IntelliJ的IDEA 5.0终于rel ... -
原型模式(Prototype)
2005-08-05 10:54 742一、概述 原型模式属于对象创建模式,通过给出一个原型对象来指明 ... -
IDEA破解过程
2005-08-05 19:11 1804开场白就不说了,直接切入正题吧。本破解的前提是安装了IDEA ... -
适配器模式(Adapter)
2005-08-06 19:39 619一、概述 类的适配器模式把被适配的类的API转换成为目标类的A ... -
A beginners guide to Dependency Injection [转载自TSS]
2005-08-08 22:30 817Scope This article presents a h ... -
Alloy破解过程
2005-08-09 15:42 8691package com.incors.plaf. ... -
接口与Object类的关系?
2005-08-19 13:53 1108今天凌晨coding的时候发现一个很有趣的现象。“Object ... -
缺省适配器模式(Default Adapter)
2005-09-06 12:01 779一、概述 当不需要全部实现适配器接口提供的方法时,可先设计一个 ... -
Object Modeling Strategies (I)
2005-09-08 10:12 590Activities and model components ... -
Joshua Bloch咏Tiger诗八首
2005-09-08 16:59 839“Ease of Development”是J2SE 1.5的 ... -
James Gosling
2005-09-14 22:01 770今天是Java China 2005的最后一天,下午没有去各个 ... -
Object Modeling Strategies (II)
2005-09-19 15:23 622Str#1d. "Invest an Hour&qu ... -
Object Modeling Strategies (III)
2005-09-19 15:26 563Identifying system purpose and ... -
Tomcat 5.5.9 不支持switch(<enum>)?
2005-09-19 18:51 811ServiceExceptionType: package p ...
相关推荐
### Struts1的Validator验证框架详解 ...然而,随着技术的发展,现代Web应用可能更倾向于使用Spring MVC、AngularJS等新兴框架,但Struts1的Validator框架依然有其不可替代的价值,特别是在遗留系统维护和优化方面。
5. **校验结果处理**:当验证失败时,Struts2会将错误信息添加到ActionContext中,然后可以通过OGNL表达式在JSP页面中展示。同时,Action的execute方法不会执行,直到所有验证都通过。 6. **拦截器(Interceptor)*...
反之,如果校验失败,会转向`input`视图资源,通常是在Struts2配置文件中指定的,用于显示错误信息给用户。 #### 三、基于验证框架的输入校验 除了手动校验,Struts2还提供了一个强大的验证框架,支持更复杂的校验...
总的来说,Struts的Validator-rules是实现数据验证的重要工具,它通过XML配置简化了验证规则的声明,提高了代码的可维护性。理解并熟练运用Validator-rules能够有效地防止因用户输入错误导致的程序异常,提升应用的...
在用户注册登录的场景中,Struts 提供了强大的验证功能,通过校验器(Validator)来确保用户输入的数据符合预设的规则,从而提高应用的安全性和用户体验。 在这个例子中,我们关注的是如何使用Struts的校验框架来...
开发者可以创建实现`Validator`接口的类,定义自己的校验逻辑,并在struts.xml中配置使用。 六、校验结果处理 当输入校验失败时,Struts2会将错误信息存储在`FieldErrors`对象中,可以通过`ActionContext`获取。...
校验规则通常定义在XML配置文件或注解中,这样可以将业务逻辑与表现层分离,提高代码可维护性。 1. XML配置文件校验: 在struts.xml或类似的配置文件中,我们可以为每个Action定义一个对应的validate()方法。这个...
当数据校验失败时,Struts2会将错误信息存储在ActionContext中,通常通过`FieldAware`接口将错误与特定的字段关联。开发者可以使用`ActionSupport`基类,该类已经实现了`FieldAware`接口,并提供了一些方便的方法,...
在Struts2中,输入校验是确保用户提交的数据符合预设规范的重要环节,可以防止非法数据进入系统,保护数据的完整性和安全性。本文将详细探讨Struts2中的输入校验机制。 首先,Struts2提供了两种主要的校验方式:...
在"struts2_1.7_validator"这个压缩包中,可能包含了实现Struts2用户登录验证的示例代码。 Struts2的Validator框架是基于Apache Commons BeanUtils和Apache Commons DBCP的,它可以自动将表单字段映射到Action类的...
- XML配置:在`struts.xml`或相应的Action配置文件中,使用`<validators>`标签定义自定义校验器,通过`<field-validator>`指定需要应用该校验器的字段。 - 注解配置:在Action类的属性上使用自定义注解,通过注解...
这需要实现`Validator`接口并配置在`struts.xml`中。 5. **结果处理**: 校验失败后,Struts2会根据配置的`action`标签中的`input`属性值重定向到相应的视图,显示错误消息。错误消息可以通过`ActionContext`获取...
客户端校验是通过在JSP页面中的`<s:form validate="true">`标签实现的,这会触发Struts2的JavaScript校验,使得用户在提交前就能得到反馈,提高了用户体验。 总结来说,Struts2的表单校验机制提供了多种灵活的方式...
在这个简单的验证例子中,我们将探讨如何利用Struts1.3的Validator来实现对用户输入的有效性检查。 Validator的核心功能是提供了一种机制,允许开发者在服务器端对用户提交的数据进行校验,确保数据的正确性和安全...
Struts 1.1 Validator 校验实例 完全代码, 直接工程 导入 <br>参考 Struts in action 上面修改!!!
本文将深入探讨Struts2校验框架的应用,包括其核心概念、配置方式、以及如何在实际项目中实现数据验证。 **1. Struts2校验框架基础** Struts2的校验框架是基于Apache Commons Validator库的,它允许开发者定义校验...
在实现这些规则时,首先需要在ActionForm类中定义字段,并添加对应的校验注解。然后,创建一个对应的ValidatorForm子类,覆盖`validate`方法。在`struts-config.xml`中,配置该ActionForm并关联校验规则。最后,当...
- 在Action类中,定义需要校验的字段,并添加`@Validated`注解或者使用Struts2的XML配置文件来指定需要校验的属性。 - 创建一个ValidatorForm或者继承ActionSupport的Action类,这些类包含了内置的校验逻辑。 - ...
它提供了强大的、可扩展的验证规则,使得开发者可以方便地在应用程序中实施数据校验,从而保证了数据的准确性和安全性。这篇教程将带你深入了解如何使用Struts的Validator框架。 一、Struts Validator框架概述 ...
总结,Struts2的输入校验机制提供了手动和自动两种方式,结合配置文件和内置校验器,能够实现灵活且强大的数据校验,有效地防止了非法数据的流入,提升了系统的安全性。在实际开发中,开发者可以根据业务需求选择...