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>