【问题标题】:Adding Response headers after chain.doFilter在chain.doFilter 之后添加响应头
【发布时间】:2016-03-09 05:11:35
【问题描述】:

我已经搜索并看到了一些关于这个问题的答案,但仍然不知道这是怎么可能的......

我被要求实现一个过滤器,该过滤器在响应标头中返回 HTTP 请求的响应时间,例如。响应头:XX 以便被网络分析客户端库收集。

这是我的代码:

public void doFilter(ServletRequest request, ServletResponse response,FilterChain chain) throws IOException, ServletException {
HttpServletResponse httpResp = (HttpServletResponse)response;
      long startTime = System.nanoTime();
      chain.doFilter(request, response);
      long endTime = System.nanoTime();
      httpResp.addHeader("response-time",endTime-startTime);
    }

我也尝试使用HttpServletResponseWrapper

我设法使用 OutputStream 修改了响应,但没有成功设置响应标头。

谢谢,杰

【问题讨论】:

  • 你能展示你的新代码吗?如果响应尚未提交,您只能 setHeaders - 您是否收到响应已提交错误?
  • 另外我应该提一下这种模型已经坏了。要设置标题,您需要在设置标题之前防止输出被写入。那么写入输出所花费的时间不属于记录的响应时间。
  • 我已经按照这个例子How to use a filter to measure performance?,并设法改变了OutputStream,但我需要的是在chain.doFilter之后添加一个头响应..也许可以使用添加响应头输出流?
  • outputStream 封装了响应体,不能用于添加headers。如果您可以将信息添加到浏览器/客户端会忽略的响应正文的末尾,但您的客户端代码可以获取这可能会起作用。
  • 你说的是不可能在chain.doFilter之后添加标题,因为响应已经发送给用户?

标签: java servlet-filters


【解决方案1】:

扩展包装实用程序类,如 HttpServletResponseWrapper(使用自定义输出流)并将其传递给链 doFilter() 方法。如果您不这样做,则在链 doFilter() 返回后,原始(未包装的)响应将消失,您将没有机会修改它。

你可以在这里找到一个例子:Looking for an example for inserting content into the response using a servlet filter

【讨论】:

  • 感谢您的回复,我使用了 HttpServletResponseWrapper 并设法更改了 OutputStream,但我没有成功添加响应头。
  • 但是在你的代码中你没有包装它。无论如何,这就是这样做的方法。为什么你没有成功?你得到任何类型的错误吗?如果不是,您确定您确实正确包装/覆盖了您与编写器相关的方法以避免响应过早刷新?
猜你喜欢
  • 2014-07-30
  • 2015-11-04
  • 2021-12-12
  • 2012-08-25
  • 2013-05-31
  • 2017-04-30
  • 1970-01-01
  • 2021-09-30
  • 1970-01-01
相关资源
最近更新 更多