JAX-RS 将标头添加到分块响应

Posted

技术标签:

【中文标题】JAX-RS 将标头添加到分块响应【英文标题】:JAX-RS add headers to chunked response 【发布时间】:2014-05-25 15:23:47 【问题描述】:

我的 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 那样简单。

【问题讨论】:

你确定第一个块没有CORS头吗? 我不是,第一个块可能会有这些标题,因为过滤器确实运行了,我已经用 SYSOUT 消息对此进行了测试。然而,问题是请求的结果没有正确的标头,例如它们不会出现在我的开发 http 客户端中,也不会出现在使用数据的 JS 应用程序中。 @AndreiI @Jcocqvan,您找到解决方案了吗?我现在面临类似的问题。 【参考方案1】:

我发现了问题。如果传输编码被分块,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);

        
    

【讨论】:

以上是关于JAX-RS 将标头添加到分块响应的主要内容,如果未能解决你的问题,请参考以下文章

如何使用符合 JAX-RS 2.0 的 RESTEasy 客户端 API 启用 NTLM 身份验证?

带有 Resteasy 的 JAX-RS:如何进行“超类”请求标头管理? [复制]

RESTful API - 批量操作的分块响应

如何在注入 JAX-RS Web 服务的 CDI bean 中获取 HTTP 请求标头?

在 JAX-RS 2.0 客户端库中处理自定义错误响应

使用 JAX-RS Jersey 2.2 获取带有 Content-Type 和 Accept 标头的请求