Struts 2 с использованием StringUtils в экспериментах валидатора

Мы используем валидаторы Struts 2 @FieldExpressionValidator и @ExpressionValidator. Эти валидаторы проверяют выражение OGNL. Есть много случаев, когда мы имеем дело со строками в этих выражениях.

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

Мы считаем, что здесь очень полезно использовать StringUtils ( isEmpty ,trimToEmpty,... ).

Поскольку мы установили для struts.ognl.allowStaticMethodAccess значение false, из соображений безопасности мы попытались решить эту проблему, добавив этот геттер в действие.

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

Любые комментарии ?!


person Alireza Fattahi    schedule 05.10.2016    source источник


Ответы (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().

person Roman C    schedule 05.10.2016
comment
Поэтому я должен добавить метод для каждого из методов StringUtils :-( Есть ли лучшие решения? - person Alireza Fattahi; 05.10.2016
comment
Может быть, есть много способов сделать это. Я не знаю, что конкретно вы спрашиваете, код, который работает, здесь, код, который не работал в вашем вопросе. Уточните свою конкретную проблему, иначе она выглядит слишком широкой. Или вы ищете только комментарии? - person Roman C; 05.10.2016
comment
Уважаемый @RomanC Да, код работает, спасибо, я искал enhancement способ, который избавил бы от необходимости определять каждый метод отдельно для каждого метода StringUtils. Если вы думаете, что это другой вопрос, я могу задать его в другом! - person Alireza Fattahi; 05.10.2016
comment
Вы можете задать другой вопрос, если вы уточните, что вам действительно нужно. - person Roman C; 05.10.2016
comment
stackoverflow.com/questions/39875242/ - person Alireza Fattahi; 05.10.2016