我们正在使用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
有任何意见吗?!
答案 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()
一样。