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:如何进行“超类”请求标头管理? [复制]