1

struts 2 将 , 设置struts.ognl.allowStaticMethodAccessfalse, 以解决安全问题。静态方法调用在某些情况下可能很有用,例如在使用验证器 expersions 中的 StringUtils 处理表达式基验证器 Struts 2 时

解决这个问题的一种方法是在动作中定义一个辅助方法,例如,如果我们想使用Math类,我们应该在下面添加:

public double randomMath(){
  return Math.random();
}


public double asinMath(double a){
  return Math.asin(a);
}

....

并将其用作${randomMath}${asinMath(1)}

正如您所看到的,对于Math类中的每个方法,我们都需要public在我们的操作中定义一个具有相同签名的方法。

有没有更好的方法来避免这些样板吸气剂?!

4

1 回答 1

1

OGNL 允许执行方法,但默认情况下禁用静态访​​问,因此您不能在表达式中使用静态方法。但是,您可以教 OGNL 哪些类需要访问静态方法。

OGNL 开发者指南:方法访问器

方法调用是 OGNL 需要根据动态信息查找方法的另一个领域。该MethodAccessor接口提供了一个挂钩来了解 OGNL 如何调用方法。当请求静态或实例方法时,调用此接口的实现者以实际执行该方法。

public interface MethodAccessor
{

    Object callStaticMethod( Map context, Class targetClass, String methodName, List args )
        throws MethodFailedException;

    Object callMethod( Map context, Object target, String methodName, List args )
        throws MethodFailedException;

}

您可以使用OgnlRuntime.setMethodAccessor(). 这是 Object 的默认方法访问器(它只是根据方法名称和参数类型找到合适的方法,并使用反射来调用该方法)。


你可以编码一些东西

public class StringUtil extends StringUtils implements MethodAccessor {
  //implement above methods
}  

动作类

public static final String MESSAGE = "hello.message";

/**
 * Field for Message property.
 */
private String message;

/**
 * Return Message property.
 *
 * @return Message property
 */
public String getMessage() {
    return message;
}
private StringUtil stringUtil = new StringUtil();

public StringUtil getStringUtil() {
  return stringUtil;
}

public String execute() throws Exception {
    setMessage(getText(MESSAGE));
    OgnlRuntime.setMethodAccessor(StringUtil.class, stringUtil);
    return SUCCESS;
}

在 JSP 中

<s:if test="!stringUtil.isEmpty(message)">
  <h2><s:property value="message"/></h2>
</s:if>

于 2016-10-06T23:08:50.967 回答