【问题标题】:How can I configure HTTP Response Headers in a Struts2 Interceptor?如何在 Struts2 拦截器中配置 HTTP 响应标头?
【发布时间】:2016-10-14 20:13:58
【问题描述】:

我们目前有一个 Java Web 应用程序正在从 Struts 1 迁移到 Struts 2。我们希望为所有 Struts 2 操作配置 X-Frame-OptionsContent-Security-Policy 标头。我们有很多动作,我想尽可能避免单独修改它们。

我目前的想法是将以下拦截器添加到默认堆栈中:

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();
    }
}

上面我试过了,还是不行,就是没有设置headers。

我需要进行哪些更改才能修复此拦截器?甚至可以以这种方式更改响应标头吗?

【问题讨论】:

    标签: java struts2 http-headers httpresponse struts2-interceptors


    【解决方案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();
    }
    

    【讨论】:

    • 获取响应的等价方式。
    • 我不知道为什么,但我记得它的行为不同;它过去发生在我身上,发生在其他人身上,也发生在 OP 身上。不过,我很乐意了解更多有关此的信息。有人吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-11-13
    • 1970-01-01
    • 2020-08-30
    • 1970-01-01
    • 1970-01-01
    • 2016-12-23
    • 2018-01-31
    相关资源
    最近更新 更多