Как настроить заголовки ответа HTTP в перехватчике Struts2?

В настоящее время у нас есть веб-приложение Java, которое находится в процессе миграции со Struts 1 на Struts 2. Мы хотели бы настроить заголовки X-Frame-Options и Content-Security-Policy для всех наших действий Struts 2. У нас есть много действий, и я не хочу изменять их все по отдельности, если это вообще возможно.

идея, которую я сейчас имею, - это следующий перехватчик, который будет добавлен в стек по умолчанию:

import javax.servlet.http.HttpServletResponse;    
import org.apache.struts2.ServletActionContext;    
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.Interceptor;

public class HttpHeaderInterceptor implements Interceptor {

    private static final long serialVersionUID = 1L;

    @Override
    public void destroy() {
        // TODO Auto-generated method stub
    }

    @Override
    public void init() {
        // TODO Auto-generated method stub
    }

    @Override
    public String intercept(ActionInvocation Invocation) throws Exception {
        HttpServletResponse response = ServletActionContext.getResponse();
        response.addHeader("X-Frame-Options", "SAMEORIGIN");
        response.addHeader("Content-Security-Policy-Report-Only", "default-src 'self'; script-src 'self' 'unsafe-inline'; object-src 'none'; style-src 'self' 'unsafe-inline'; img-src 'self'; media-src 'none'; frame-src 'none'; font-src 'self'; connect-src 'self'; report-uri REDACTED");
        response.addHeader("X-Content-Security-Policy-Report-Only", "default-src 'self'; script-src 'self' 'unsafe-inline'; object-src 'none'; style-src 'self' 'unsafe-inline'; img-src 'self'; media-src 'none'; frame-src 'none'; font-src 'self'; connect-src 'self'; report-uri REDACTED");
        return Invocation.invoke();
    }
}

Я пробовал выше, и он не работает, он не устанавливает заголовки.

Какие изменения мне нужно внести, чтобы исправить этот перехватчик? Можно ли вообще изменить заголовки ответа таким образом?


person Nzall    schedule 14.06.2016    source источник


Ответы (1)


Правильный способ получить ответ (и запрос) внутри перехватчика — через InvocationContext, а не через ServletActionContext:

public String intercept(ActionInvocation Invocation) throws Exception {

    final ActionContext ac = invocation.getInvocationContext();
    HttpServletResponse response = (HttpServletResponse) ac.get(StrutsStatics.HTTP_RE‌​SPONSE);
    //HttpServletResponse response = ServletActionContext.getResponse();

    response.addHeader("X-Frame-Options", "SAMEORIGIN");
    response.addHeader("Content-Security-Policy-Report-Only", "default-src 'self'; script-src 'self' 'unsafe-inline'; object-src 'none'; style-src 'self' 'unsafe-inline'; img-src 'self'; media-src 'none'; frame-src 'none'; font-src 'self'; connect-src 'self'; report-uri REDACTED");
    response.addHeader("X-Content-Security-Policy-Report-Only", "default-src 'self'; script-src 'self' 'unsafe-inline'; object-src 'none'; style-src 'self' 'unsafe-inline'; img-src 'self'; media-src 'none'; frame-src 'none'; font-src 'self'; connect-src 'self'; report-uri REDACTED");
    return Invocation.invoke();
}
person Andrea Ligios    schedule 14.06.2016
comment
Это эквивалентный способ получить ответ. - person Roman C; 14.06.2016
comment
Я не знаю почему, но я помню, что он ведет себя по-другому; это случилось со мной в прошлом, с другими людьми и с ОП. Однако я был бы признателен, если бы узнал об этом больше. Кто угодно ? - person Andrea Ligios; 14.06.2016