在Struts中使用Validator实现可配置的信息校验(二)

三、自定义校验逻辑

毕竟Struts提供的校验逻辑有限,不可能满足所有的开发需要,因此有时必须对其进行扩展。这里举一个实际项目中的例子:校验码检查。现在很多网站为了防止恶意的页面刷新攻击,都使用了图片形式的校验码,如:

表单提交后需要检查校验码(存在request或session里)和用户输入是否一致,代码如下:

 1 public   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官网上找一下相关文档。 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值