出力にバイナリドキュメントでは、Javaでのフィルタを使用してHTML文書に基づいてどのように

StackOverflow https://stackoverflow.com/questions/493924

質問

これは少し混乱するかもしれませんが、私はいくつかの問題を抱えて。私の目標は、入力されたHTML文書を取得し、その文書を処理して出力する画像文書をHTMLデータを使用することです。例えば、ユーザは、クエリ文字列内のいくつかのアクション= PNGと、URLを要求すると、フィルタはURLと出力画像文書に対して呼び出されます。

私はすべてを試してみましたが、私の環境(のWebsphere)で、私は一種類のみの出力にできています。入力タイプがtext / htmlであるならば、私は出力のみ、テキスト文書、私は出力にバイナリドキュメントを見えることはできませんすることができます。どうして?私は違法な状態例外を毎回取得するのでます。

[1/29/09 17:57:59 576 EST] 00000020 SystemErr R java.lang.IllegalStateException:SRVE0209E:Writerは既に取得 [1/29/09 17:59:57:576 EST] com.ibm.ws.webcontainer.srt.SRTServletResponse.getOutputStream(SRTServletResponse.java:505)で00000020 SystemErr R

私は私のコードのすべてを明らかにしない擬似コードを使用しています:

<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