这可以是有点混乱,但我有一些麻烦。我的目标是把一个输入HTML文档,然后处理该文件,并使用HTML数据输出图像文件。例如,用户将请求的URL,与一些行动=在查询字符串为png,然后该过滤器将被调用的URL和输出图像文件。

我已经试过一切,但在我的环境(的Websphere),我只能把一个类型的输出。如果输入类型为text / html的话,我只能输出一个文本文件,我似乎无法可输出二进制文档。为什么?因为我每次都得到一个非法状态异常。

[1/29/09 17:59:57:576 EST] 00000020 SystemErrřjava.lang.IllegalStateException:已经获得编剧:SRVE0209E [1/29/09 17:59:57:576 EST] 00000020 SystemErrř在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()

有帮助吗?

解决方案

在问题确实出现了您正在包裹响应之前打开所述响应写入器。

看起来你应该能够做到:

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

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

其他提示

我具有一定的WebSphere没有经验,但一个共同的问题是,你试图操纵HTTP头,你已经承诺发送后身体 - 一旦Web服务器开始提供内容,你可以没有任何更多,因为更新的标题他们已经被发送。

也许你需要检查你的文档和示例。举例来说,我不明白为什么你叫response.get *()没有实际看到的结果。你确定这是必要的,或者这是因为你修剪你的代码?

干杯,   沃尔克

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top