Как вывести двоичный документ на основе HTML-документа, используя фильтры в Java
Это может немного смущать, но у меня возникли некоторые проблемы. Моя цель - взять входной HTML-документ, а затем обработать этот документ и использовать данные HTML для вывода документа с изображением. Например, пользователь запросит URL-адрес с некоторым действием =png в строке запроса, а затем будет вызван фильтр для URL-адреса и выходного документа изображения.
Я перепробовал все, но в моей среде (Websphere) я могу выводить только один тип. Если тип ввода text/html, то я могу вывести только текстовый документ, но я не могу вывести двоичный документ. Зачем? Потому что я получаю исключение из незаконного государства каждый раз.
[29.01.09 17:59:57:576 EST] 00000020 SystemErr R java.lang.IllegalStateException: SRVE0209E: Автор уже получен [29.01.09 17: 59: 57: 576 EST] 00000020 SystemErr R на ком.ibm.ws.webcontainer.srt.SRTServletResponse.getOutputStream(SRTServletResponse.java:505)
Я использую псевдокод, чтобы не раскрывать весь мой код:
<filter>
<filter-name>TestFilter</filter-name>
<filter-class>
com.util.TestFilter
</filter-class>
</filter>
<filter-mapping>
<filter-name>TestFilter</filter-name>
<url-pattern>/index_test2.html</url-pattern>
</filter-mapping>
Код класса Wrapper по сути таков:
public class ContentCaptureServletResponse extends HttpServletResponseWrapper {
private ByteArrayOutputStream contentBuffer;
private PrintWriter writer;
public PrintWriter getWriter() throws IOException {
if (writer == null) {
contentBuffer = new ByteArrayOutputStream();
writer = new PrintWriter(contentBuffer);
}
return writer;
}
public String getContent(){
try {
writer = getWriter();
} catch (IOException e) {
e.printStackTrace();
}
writer.flush();
String xhtmlContent = new String(contentBuffer.toByteArray());
System.out.println(xhtmlContent);
return xhtmlContent;
}
}
И код фильтра это:
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain filterChain) throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest) req;
HttpServletResponse response = (HttpServletResponse) resp;
final String renderType = request.getParameter("R");
final String renderClassName = request.getParameter("C");
if ((renderType != null) && (renderClassName != null)) {
try {
this.setFilterChain(filterChain);
response.setContentType("image/png");
PrintWriter out = response.getWriter();
// I call getWriter but not BOTH!
//response.getOutputStream();
response.getWriter();
// Build up the HTML document into a string.
CaptureResponse capContent = new CaptureResponse(response);
this.mainFilterChain.doFilter(req, );
String myString = capHtmlContent.getContent();
// What I really want to do here is output an output stream
// so I can write a binary image
processStr(myString);
response.getOutputStream();
response.write(binaryimage)
} catch (Exception e) {
e.printStackTrace();
}
// No data will be output to the user.
} else {
filterChain.doFilter(request, response);
} // End of if-else
} // End of the method.
Код работает, если я хочу взять некоторые входные текстовые документы HTML. Я предполагаю из-за открытого потока printwriter. Но у меня проблемы с переходом в другой формат. В основном, потому что я не могу вызвать response.getOutputStream()
2 ответа
Проблема, по-видимому, заключается в том, что вы открываете устройство записи ответов перед упаковкой ответа.
Похоже, вы должны быть в состоянии сделать:
this.setFilterChain(filterChain);
CaptureContent capContent = new CaptureResponse(response);
doFilter()
process();
response.setContentType("image/png");
response.getOutputStream().write(imagedata);
Вы определенно не можете безопасно открыть как Writer, так и OutputStream
У меня нет опыта работы с Websphere, но одна из распространенных проблем заключается в том, что вы пытаетесь манипулировать заголовком HTTP после того, как уже приняли на себя обязательство отправлять тело - после того, как веб-сервер начал доставлять контент, вы больше не можете обновлять заголовки, так как они уже отправлено.
Может быть, вам нужно просмотреть вашу документацию и примеры. Например, я не понимаю, почему вы вызываете response.get*(), фактически не глядя на результат. Вы уверены, что это необходимо, или это потому, что вы сократили свой код?
Ура, Фолькер