这里有一个有点疯狂的想法,但我可能会这样解决。
如果你真的不能触摸损坏的 Filter(真的吗?),那么写另一个过滤器放在损坏的 Filter 前面。
这看起来比它实际上更复杂,但那只是因为 Java 很啰嗦,所以请忍耐一下。
基本上,它使用 HttpServletResponseWrapper
在过滤器和其后面的 servlet 中包装/“覆盖”response.getWriter()
。
因此,当你的损坏的 Filter 调用 response.getWriter()
时,它将获得一个代理 PrintWriter,它仅在第一次实际写入时才调用真正的 response.getWriter()
。
然后,即使损坏的 Filter 在不写入的情况下调用 response.getWriter()
,也不再重要了。
我实际上还没有测试过这段代码,但我相信它应该可以工作。
请注意,这假设损坏的 Filter 调用 response.getWriter()
而没有实际写入内容。如果损坏的过滤器写入了某些东西,然后你尝试向其写入 PDF,输出将是损坏的。
import javax.servlet.*;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpServletResponseWrapper;
import java.io.IOException;
import java.io.PrintWriter;
import java.io.Writer;
public class BrokenWriterGetterFixingFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
public void doFilter(ServletRequest servletRequest, final ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
filterChain.doFilter(servletRequest, new BrokenWriterGetterFixingResponseWrapper((HttpServletResponse) servletResponse));
}
@Override
public void destroy() {
}
private static class BrokenWriterGetterFixingResponseWrapper extends HttpServletResponseWrapper {
public BrokenWriterGetterFixingResponseWrapper(HttpServletResponse response) {
super(response);
}
@Override
public PrintWriter getWriter() throws IOException {
return new PrintWriter(new BrokenWriterGetterFixingWriter(getResponse()));
}
}
private static class BrokenWriterGetterFixingWriter extends Writer {
private PrintWriter responseWriter;
private final ServletResponse response;
public BrokenWriterGetterFixingWriter(ServletResponse response) {
this.response = response;
}
@Override
public void write(char[] cbuf, int off, int len) throws IOException {
getResponseWriter().write(cbuf, off, len);
}
@Override
public void flush() throws IOException {
getResponseWriter().flush();
}
@Override
public void close() throws IOException {
getResponseWriter().close();
}
private PrintWriter getResponseWriter() throws IOException {
if (null == responseWriter) {
responseWriter = response.getWriter();
}
return responseWriter;
}
}
}
web.xml
中自己定义这些过滤器。或者它们是第三方过滤器吗?请在此处复制它们的<filter-class>
名称。或者它们是之前参与该项目的开发人员所包含的吗?请联系开发人员。 - BalusC