1

我的过滤器应该编辑响应的 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;
  }
}

完整代码在这里:

使用响应包装器将所有输出转换为大写的过滤器

4

2 回答 2

1

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

于 2013-10-01T12:48:44.917 回答
0

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

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

于 2013-10-01T14:10:29.830 回答