2009-01-29 14 views
4

这可能有点令人困惑,但我遇到了一些麻烦。我的目标是获取输入的HTML文档,然后处理该文档并使用HTML数据输出图像文档。例如,用户将请求一个URL,在查询字符串中使用一些action = png,然后将为该URL和输出图像文档调用过滤器。如何使用Java中的过滤器输出基于HTML文档的二进制文档

我已经尝试了一切,但在我的环境(Websphere)中,我只能输出一种类型。如果输入类型是text/html,那么我只能输出一个文本文档,我似乎无法输出二进制文档。为什么?因为每次都会收到非法的状态异常。

[1/29/09 17:59:57:576 EST] 00000020 SystemErr R java.lang.IllegalStateException:SRVE0209E:作者已经获得 [1/29/09 17: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文本文档代码工作。我假设是因为公开的printwriter流。但是我遇到了不同格式的问题。基本上,因为我不能调用response.getOutputStream()

+0

我想我可能已经想通了。我可以使用'response.getOutputstream'。但是我有代码,浏览器不会重建页面,所以看起来我得到了一个零响应。基本上,我的方法将起作用。 – 2009-01-30 00:02:40

+0

你能解释为什么你需要使用response.getWriter()吗? – 2009-01-30 00:07:47

回答

3

问题确实出现了,你是之前包裹响应打开响应作家。

看起来你应该能够做到:

this.setFilterChain(filterChain); 
CaptureContent capContent = new CaptureResponse(response); 
doFilter() 
process(); 
response.setContentType("image/png"); 
response.getOutputStream().write(imagedata); 

你绝对不能安全地打开两个作家和OutputStream的

0

我没有使用Websphere的经验,但一个常见的问题是,当您已经承诺发送正文后尝试处理HTTP头 - 一旦Web服务器开始提供内容,因为它们已经发送了,所以您不能再更新标题。

也许您需要查看您的文档和示例。例如,我不明白为什么调用response.get *()而没有真正查看结果。你确定这是必要的还是因为你修剪了你的代码?

干杯, 沃尔克