문제

이것은 약간 혼란 스러울 수 있지만 약간의 문제가 있습니다. 내 목표는 입력 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가 컨텐츠를 전달하기 시작하면 헤더가 더 이상 업데이트 할 수 없습니다. 이미 전송되었습니다.

문서와 예를 검토해야 할 수도 있습니다. 예를 들어, 결과를 실제로 보지 않고 응답*()을 호출하는 이유가 없습니다. 이것이 필요하다고 확신합니까, 아니면 코드를 다듬기 때문에 이것이 있습니까?

건배, 볼커

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top