Портлет Struts2 считывает файлы cookie с помощью CookieInterceptor

Я создаю веб-приложение, используя JSR286, Struts2 для портлетов на WebSphere Portal 6.1.5. Проблема в том, что я не могу сделать работу встроенной в CookieInterceptor. Я пробовал это в src/struts.xml:

<package name="web-app-default" extends="struts-portlet-default , json-default" abstract="true">

    <interceptors>
        <interceptor name="superInterceptor" class="ru.app.SuperInterceptor" />         
        <interceptor-stack name="ekp-cookie-stack">
            <interceptor-ref name="cookie">
                    <param name="cookiesName">my-filter-cookie</param>
                </interceptor-ref>  
        </interceptor-stack>
    </interceptors>



    <default-interceptor-ref name="portletDefaultStack" />

    <global-results>
            <result name="error">/jsp/common/error.jsp</result>
    </global-results>
</package>

И действие:

public abstract class EventGeneralAction extends GeneralAction implements CookiesAware{
//some code...

    /** {@link CookieInterceptor} should inject ekp-filter-cookie. */
        @SuppressWarnings("unchecked")
        public void setCookiesMap(Map cookies){
            LOG.trace("#setCookiesMap -> cookies[{}]", cookies);
            this.cookies = cookies;
        }
    }

Метод setCookiesMap не вызывается. Я использовал firebug, я действительно вижу, что в заголовке запроса есть мой «my-filter-cookie» (устанавливается с помощью плагина cookie JQuery). WebDeveloper для Mozilla показывает, что в браузере есть такой файл cookie, и срок его действия истекает CURRENT_TIME+1 год.

Я пробовал другую конфигурацию. Я написал перехватчик для действия:

<!-- Shows events on desired day of year. ShowDayEventsAction is a subclass of EventGeneralAction -->
    <action name="main" class="ru.app.ShowDayEventsAction" >
        <interceptor-ref name="cookie">
            <param name="cookiesName">my-filter-cookie</param>
            </interceptor-ref>  
        <result>/jsp/event/view/day.jsp</result>
    </action>

Опять провал...? Что я делаю неправильно? Пожалуйста, предложите.


person Capacytron    schedule 20.11.2010    source источник


Ответы (1)


Ты:

  • Определение перехватчика под названием «superInterceptor» (не уверен, где это подходит)
  • Определение стека перехватчика под названием «ekp-cookie-stack», состоящего исключительно из перехватчика cookie.
  • Объявление "portletDefaultStack" в качестве стека перехватчиков по умолчанию

Поскольку "portletDefaultStack" не содержит вашего "ekp-cookie-stack", перехватчик cookie не будет запущен. По сути, вы настраиваете один стек, а затем указываете Struts2 использовать другой стек.

Попробуй это:

<interceptor-stack name="portletDefaultStackWithCookie">
    <interceptor-ref name="portletState"/>
    <interceptor-ref name="portletAware"/>
    <interceptor-ref name="cookie">
        <param name="cookiesName">my-filter-cookie</param>
    </interceptor-ref>
    <interceptor-ref name="defaultStack"/>
</interceptor-stack>

<default-interceptor-ref name="portletDefaultStackWithCookie" />

Вы также можете установить точку останова в методе CookieInterceptor intercept, чтобы убедиться, что он вызывается правильно.

person Steven Benitez    schedule 20.11.2010
comment
Я только что понял. Я думал, что ‹interceptors› будут добавлены в стек, который определен как default-interceptor-ref, но это была моя ошибка. - person Capacytron; 20.11.2010
comment
Получил странное исключение в SystemOut.log: - person Capacytron; 22.11.2010
comment
[22.11.10 23:31:30:177 MSK] 0000006c SystemOut O 22.11 23:31:30.176 [WARN ] com.opensymphony.xwork2.util.logging.commons.CommonsLoggerOgnl ValueStack: com.opensymphony.xwork2.util. logging.commons.CommonsLoggerError устанавливает выражение «my-filter-cookie» со значением «SOME-VALUE-GOEs-HERE»: (my-filter) — cookie в ognl.SimpleNode.setValueBody(SimpleNode.java:257) Почему это происходит ? my-filter-cookie - это файл cookie... Не понимаю. Может быть, знак «-» сбивает с толку OGNL? - person Capacytron; 22.11.2010