Struts 2 вызывает статический метод, когда struts.ognl.allowStaticMethodAccess имеет значение false

Стойки 2 устанавливают struts.ognl.allowStaticMethodAccess в false, по вопросам безопасности. Статический вызов метода может быть полезен в некоторых случаях, например, при работе с валидаторами базы выражений Struts 2 с использованием StringUtils в выражениях валидатора.

Одним из способов решения этой проблемы является определение вспомогательного метода в действии, например, если мы хотим использовать Math класс, который мы должны добавить ниже:

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


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

....

И использовать его как ${randomMath} или же ${asinMath(1)}

Как вы можете видеть для каждого метода в Math класс нам нужно определить public метод в нашем действии, с той же подписью.

Есть ли лучший способ избежать этих шаблонных добытчиков?!

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(), Это метод доступа по умолчанию для объекта (который просто находит подходящий метод на основе имени метода и типов аргументов и использует отражение для вызова метода).


Вы можете кодировать что-то

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>

Другие вопросы по тегам