【问题标题】:JAX-RS add headers to chunked responseJAX-RS 将标头添加到分块响应
【发布时间】: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,您找到解决方案了吗?我现在面临类似的问题。

标签: java jakarta-ee jboss jax-rs resteasy


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

        
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-10-27
    • 2021-06-09
    • 2015-07-19
    • 1970-01-01
    • 2017-03-09
    • 1970-01-01
    • 2013-12-15
    相关资源
    最近更新 更多