我的过滤器应该编辑响应的HTML。但是当我导航到某个页面时,它什么也没做,因为
newResponse.toString();
返回null
。
进一步调试显示,在toString
方法中,writer
为null
以下是似乎是问题的部分:
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
答案 0 :(得分:1)
据我所知,servlet过滤器链在HTTP请求之前调用到达目标(例如 - servlet)。当您使用Filter来获取请求目标点生成的内容时,您将获得null
,因为它将仅在将来存在。
但是文档中提到了一个适当的解决方案(http://tomcat.apache.org/tomcat-5.5-doc/servletapi/javax/servlet/Filter.html)。
只需使您的响应包装器装饰对HttpServletResponse内容的访问。例如 - 使用您的自定义覆盖默认编写器,它将检测字母并在其write()方法中将它们大写。
答案 1 :(得分:0)
我尝试过滤的页面是index.html
。
似乎过滤器只能编辑以.jsp
结尾的页面的响应。