Вот несколько сумасшедшая идея, но я, вероятно, решил бы это так.
Если вы действительно не можете коснуться сломанного фильтра (правда?), напишите другой фильтр, который вы поместите перед сломанным фильтром.
Это выглядит сложнее, чем есть на самом деле, но это только из-за многословия Java, поэтому, пожалуйста, потерпите меня.
По сути, он использует HttpServletResponseWrapper
для переноса/"переопределения" response.getWriter()
в фильтрах и сервлете, следующем за ним в цепочке.
Таким образом, когда ваш сломанный фильтр вызывает 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;
}
}
}
person
Christoffer Hammarström
schedule
26.04.2010
web.xml
. Или это сторонние фильтры? Не могли бы вы скопировать их<filter-class>
имена сюда? Или они включены разработчиком, который ранее работал над проектом? Свяжитесь с разработчиком. - person BalusC   schedule 26.04.2010