Java에서 필터를 사용하여 HTML 문서를 기반으로 이진 문서를 출력하는 방법
-
20-08-2019 - |
문제
이것은 약간 혼란 스러울 수 있지만 약간의 문제가 있습니다. 내 목표는 입력 HTML 문서를 가져온 다음 해당 문서를 처리하고 HTML 데이터를 사용하여 이미지 문서를 출력하는 것입니다. 예를 들어, 사용자는 QueryString에 action = png가있는 URL을 요청한 다음 URL 및 출력 이미지 문서에 필터가 호출됩니다.
나는 모든 것을 시도했지만 내 환경 (WebSphere)에서 한 유형 만 출력 할 수 있습니다. 입력 유형이 텍스트/html 인 경우 텍스트 문서 만 출력 할 수 있습니다. 이진 문서를 출력 할 수 없습니다. 왜요? 매번 불법적 인 상태 예외를 얻기 때문입니다.
1/29/09 17 : 59 : 57 : 576 EST] 00000020 Systemerr R Java.lang.ilegalstateException : SRVE0209E : 이미 획득 한 작가 [1/29/09 17 : 59 : 59 : 57 : 576 EST] 00000020 SystemerR R에서 Com. 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>
래퍼 클래스 코드는 본질적으로 다음과 같습니다.
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 텍스트 문서를 사용하려면 코드가 작동합니다. 나는 오픈 프린트 라이터 스트림 때문에 가정합니다. 그러나 나는 다른 형식으로가는 데 어려움을 겪고 있습니다. 기본적으로 response.getOutputStream ()을 호출 할 수 없기 때문에
해결책
문제는 응답을 마무리하기 전에 응답 작성자를 열고있는 것으로 보입니다.
당신이 할 수 있어야하는 것처럼 보입니다.
this.setFilterChain(filterChain);
CaptureContent capContent = new CaptureResponse(response);
doFilter()
process();
response.setContentType("image/png");
response.getOutputStream().write(imagedata);
당신은 분명히 작가와 출력 스트림을 모두 안전하게 열 수는 없습니다.
다른 팁
WebSphere에 대한 경험이 없지만 한 가지 일반적인 문제는 이미 본문을 보내겠다고 약속 한 후 HTTP 헤더를 조작하려고한다는 것입니다. Webserver가 컨텐츠를 전달하기 시작하면 헤더가 더 이상 업데이트 할 수 없습니다. 이미 전송되었습니다.
문서와 예를 검토해야 할 수도 있습니다. 예를 들어, 결과를 실제로 보지 않고 응답*()을 호출하는 이유가 없습니다. 이것이 필요하다고 확신합니까, 아니면 코드를 다듬기 때문에 이것이 있습니까?
건배, 볼커