Struts 2在验证器扩展中使用StringUtils

时间:2016-10-05 09:27:20

标签: java struts2 ognl valuestack

我们正在使用Struts 2验证器@FieldExpressionValidator@ExpressionValidator。这些验证器检查OGNL表达式。在很多情况下,我们在这些表达式中处理字符串。

expression="(captcha=='' && captcha== null || ....)

如果我们可以在这里使用StringUtils(isEmpty,trimToEmpty,...),我们发现它非常有用。

当我们将struts.ognl.allowStaticMethodAccess设置为false时,出于安全问题,我们尝试通过将此getter添加到操作来解决此问题

public StringUtils getStringUtils(){
        return new StringUtils();
    }

然后在表达式中stringUtils.isEmpty(captcha)。但它没有用。

调试我们测试

ActionContext.getContext().getValueStack().findValue("stringUtils"); //returns org.apache.commons.lang3.StringUtils@693ade51 which shows there is an object in the stack

ActionContext.getContext().getValueStack().findValue("stringUtils.isEmpty('dd')"); //returns null

有任何意见吗?!

1 个答案:

答案 0 :(得分:1)

isEmpty是一个静态方法,应该使用类前缀静态访问。一旦使用OGNL,就必须允许静态方法访问或为该方法编写包装器,即

public boolean stringUtilsIsEmpty(String captcha) {
    return StringUtils.isEmpty(captcha);
}

然后

ActionContext.getContext().getValueStack().findValue("stringUtilsIsEmpty('dd')");

但是,在JSP中你可以做到

<s:if test="captcha != null && captcha != ''">
  do something
</s:if>

这与StringUtils#isEmpty()一样。