繁体   English   中英

JAX-RS 向分块响应添加标头

[英]JAX-RS add headers to chunked response

我的 JBOSS 7.1.1 服务器上的 REST API 服务遇到了一些问题。
现在我使用 RESTEasy 实现,我有以下过滤器来向响应添加 CORS 标头:

@WebFilter(filterName = "HeaderFilter", urlPatterns = {"/*"})
public class HeaderFilter implements Filter {

    public void init(FilterConfig arg0) throws ServletException{}
    public void destroy(){}

    public void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain) throws IOException, ServletException
    {
        //Just continue the request
        filterChain.doFilter(request, response);

        //After the request add the response headers
        HttpServletResponse responseObj = (HttpServletResponse)response;
        responseObj.addHeader("Access-Control-Allow-Origin", "*");
        responseObj.addHeader("Access-Control-Allow-Methods", "GET,POST,PUT,DELETE,OPTIONS");
        responseObj.addHeader("Access-Control-Allow-Headers", "X-Requested-With, Content-Type, Content-Length");
    }
}

我的问题是服务器有时会选择分部分发送响应。
通过传输编码:分块“协议”。
这无关紧要,我对此没有任何问题,但是在执行此操作时它不再添加 CORS 标头。 应用程序的客户端现在无法使用数据,我无法弄清楚如何将 CORS 标头添加到最终响应中。

你们知道我如何解决这个问题吗?

编辑:顺便说一下,我正在使用 Jackson 将我的延迟加载模型转换为 JSON,所以我认为这并不像设置 Content-Length 那样简单。

我发现了问题。如果传输编码是分块的,那么在filterChain.doFilter之后响应头是不可编辑的。所以responseObj.addHeader之后不编辑响应头。所以你必须在doFilter之前做。像这样

@WebFilter(filterName = "HeaderFilter", urlPatterns = {"/*"})
public class HeaderFilter implements Filter {

    public void init(FilterConfig arg0) throws ServletException{}
    public void destroy(){}

    public void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain) throws IOException, ServletException
    {
        //Before the request add the response headers
        HttpServletResponse responseObj = (HttpServletResponse)response;
        responseObj.addHeader("Access-Control-Allow-Origin", "*");
        responseObj.addHeader("Access-Control-Allow-Methods", "GET,POST,PUT,DELETE,OPTIONS");
        responseObj.addHeader("Access-Control-Allow-Headers", "X-Requested-With, Content-Type, Content-Length");

        //Just continue the request
        filterChain.doFilter(request, response);

        
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM