Заголовок ответа перехватчика Struts 2 не установлен - PullRequest
0 голосов
/ 13 марта 2019

Struts 2.5.18

У меня проблема с настройкой заголовка в перехватчике Struts 2, и клиент не получает заголовок обратно.Я использую точно такой же перехватчик в другом проекте Struts 2. Без проблем.

Я наткнулся на этот пост Как настроить заголовки ответа HTTP в перехватчике Struts2? , у которого была та же проблемаи разрешил его, переключив получение ответа с ServletActionContext.getResponse() на получение его из контекста вызова invocation.getInvocationContext().get(StrutsStatics.HTTP_RESPONSE)

Это привело к тому же результату, что заголовок все еще не отправлялся обратно в браузер.Я использую инструменты разработчика для мониторинга заголовка ответа, и его нет.

Кроме того, я помещаю отладочное сообщение сразу после вызова setHeader () в ответе, чтобы увидеть, содержал ли ответ новый заголовок, используяcontainsHeader ().containsHeader () приводит к FALSE, как будто setHeader вообще не работает.

Есть ли у кого-нибудь предложения о том, что может происходить с объектом ответа?Метод intercept () ниже

public String intercept(ActionInvocation invocation) throws Exception {
    String result = invocation.invoke();
    Boolean hasValidationErrors = Boolean.FALSE;
    Object action = invocation.getAction();
    if(action instanceof ValidationAware) {
        ValidationAware validationAware = (ValidationAware) action;
        hasValidationErrors = validationAware.hasErrors();

    }

    HttpServletResponse response = (HttpServletResponse) invocation.getInvocationContext().get(StrutsStatics.HTTP_RESPONSE);
    response.setHeader(VALIDATION_FLAG_HEADER_NAME, String.valueOf(hasValidationErrors));

    if (log.isDebugEnabled()) log.debug("Does response contain new header? " + response.containsHeader(VALIDATION_FLAG_HEADER_NAME));

    return result;
}

Обновление: рабочий код после применения исправления Дейва

  public String intercept(ActionInvocation invocation) throws Exception {

        invocation.addPreResultListener((actionInvocation, resultCode) -> {
            // perform operation necessary before Result execution
            Boolean hasValidationErrors = Boolean.FALSE;
            Object action = invocation.getAction();
            if(action instanceof ValidationAware) {
                ValidationAware validationAware = (ValidationAware) action;
                hasValidationErrors = validationAware.hasErrors();

            }

            HttpServletResponse response = (HttpServletResponse) invocation.getInvocationContext().get(StrutsStatics.HTTP_RESPONSE);
            response.setHeader(VALIDATION_FLAG_HEADER_NAME, String.valueOf(hasValidationErrors));

            if (log.isDebugEnabled()) log.debug("Does response contain new header? " + response.containsHeader(VALIDATION_FLAG_HEADER_NAME));

        });

        return invocation.invoke();
    }

1 Ответ

1 голос
/ 13 марта 2019

Вы устанавливаете заголовок после вызова invoke, после чего ответ будет обработан.

От https://struts.apache.org/core-developers/writing-interceptors.html:

Имейте в виду, что вызов вернетсяпосле того, как результат был вызван (например, после того, как ваш JSP был визуализирован), что делает его идеальным для таких вещей, как шаблоны открытого сеанса в представлении.Если вы хотите что-то сделать до вызова результата, вам следует реализовать PreResultListener.

Установить заголовок перед вызовом invoke или реализовать PreResultListener.

...