午夜拍键惊奇
子夜 编程 代码与我同在
posts - 48,comments - 118,trackbacks - 79

三、自定义校验逻辑

毕竟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}

注释:
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

validation.xml中的定义:

<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);" />

其中第一行定义了需要转译的FormBean名,这里是“formName”,第二行在该FormBean封装的表单上添加onsubmuit事件,而该事件调用的函数会在JSP请求到客户端时由Validator框架自动生成,命名规则为“validateXXX”,其中“XXX”就是第一行中的formName属性的值,这里是“formName”,因此生成的函数名为“validateFormName”。
关于为自定义的Validator(如上文的MyValidator)创建JS代码,我没有实现过,感兴趣的话可以去Struts官网上找一下相关文档。
posted on 2006-03-07 18:38 ^ Mustang ^ 阅读(1708) 评论(1)  编辑  收藏 所属分类: Struts

FeedBack:
# re: 在Struts中使用Validator实现可配置的信息校验(二)
2006-03-07 19:53 | 王巍成
good!!:)  回复  更多评论
  

只有注册用户登录后才能发表评论。


网站导航: