這是一個有點瘋狂的想法,但我可能會解決這個問題。
如果您確實無法觸摸破碎的濾鏡(真的?),請在破碎的濾鏡之前再寫一個濾鏡。
這看起來比它更復雜,但這只是因爲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