这是一个有点疯狂的想法,但我可能会解决这个问题。
如果您确实无法触摸破碎的滤镜(真的?),请在破碎的滤镜之前再写一个滤镜。
这看起来比它更复杂,但这只是因为Java的冗长性,所以请耐心等待。
基本上它使用HttpServletResponseWrapper
在过滤器中覆盖/“覆盖”response.getWriter()
以及在链中跟随它的servlet。
所以,当你的破碎过滤器调用response.getWriter()
时,它将代替获得一个代理PrintWriter,它在第一次实际写入时只调用实际的response.getWriter()
。
然后它不再重要,如果破碎的过滤器调用response.getWriter()
而不写入它。
我没有真正测试过这段代码,但我相信它应该可以工作。
请注意,这假定破碎的过滤器在没有实际写入内容的情况下调用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;
}
}
}
下面那是什么过滤器做什么? – BalusC 2010-04-26 11:55:49
我不知道 - 在我轮到之前有几个过滤器会被调用。没有办法触及这些:( – Thomas 2010-04-26 12:18:32
如果过滤器写了任何东西,你的输出将会损坏,如果过滤器没有写入任何东西,它不应该叫做response.getWriter()。 – 2010-04-26 13:22:23