【问题标题】:Servlet filter insists that there's no response textServlet 过滤器坚持没有响应文本
【发布时间】:2013-10-01 11:35:38
【问题描述】:

我的过滤器应该编辑响应的 HTML。但是当我导航到一个页面时,它什么也不做,因为

newResponse.toString();

返回null

进一步调试表明,在 toString 方法中,writernull

这似乎是问题的部分:

public ServletOutputStream getOutputStream() throws IOException {
    if (getWriterCalled) {
      throw new IllegalStateException("getWriter already called");
    }

    getOutputStreamCalled = true;
    return super.getOutputStream();
  }

  public PrintWriter getWriter() throws IOException {
    if (writer != null) {
      return writer;
    }
    if (getOutputStreamCalled) {
      throw new IllegalStateException("getOutputStream already called");
    }
    getWriterCalled = true;
    writer = new PrintWriter(charWriter);
    return writer;
  }

  public String toString() {
    String s = null;

    if (writer != null) {
      s = charWriter.toString();
    }
    return s;
  }
}

完整代码在这里:

Filter that uses a response wrapper to convert all output to uppercase

【问题讨论】:

  • 您已经包裹了Writer,但没有包裹OutputStream。您的 servlet 可能正在直接写入 OutputStream。使用调试器。

标签: java tomcat servlets servlet-filters


【解决方案1】:

据我所知,servlet 过滤器链是在 HTTP 请求到达目的地之前调用的(例如 - servlet)。当您使用过滤器获取由请求目标点生成的内容时,您会得到null,因为它只会在将来存在。 但是有一个适当的解决方案,在文档 (http://tomcat.apache.org/tomcat-5.5-doc/servletapi/javax/servlet/Filter.html) 中提到。 只需让您的响应包装器修饰对 HttpServletResponse 内容的访问即可。例如 - 用您的自定义覆盖默认编写器,这将在他的 write() 方法中检测字母并将它们大写。

【讨论】:

  • 我查看了该链接,但没有看到您提到的解决方案。
  • 在 doFilter() 描述中有一句“3。可选地用自定义实现包装响应对象以过滤内容或标题以进行输出过滤”。我只是试图发展这个想法。真正考虑覆盖/链接的输入或输出流。
  • 谢谢。事实证明我的问题比这容易得多。但是这个链接还是有用的。
【解决方案2】:

我试图过滤的页面是index.html

过滤器似乎只能编辑以.jsp结尾的页面的响应。

【讨论】:

  • 这只是在过滤器映射中修复 URL 模式的问题。
  • @BalusC 当前 url-pattern 设置为 /*。为什么它只接受 .jsp 文件?
猜你喜欢
  • 2014-08-08
  • 1970-01-01
  • 2014-09-18
  • 2014-04-17
  • 2016-05-15
  • 2015-11-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多