Wie ein binäres Dokument zur Ausgabe auf einem HTML-Dokument basierte Filter in Java unter Verwendung von

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

Frage

Dies kann ein wenig verwirrend sein, aber ich mit etwas Mühe. Mein Ziel ist es, ein Eingabe HTML-Dokument zu nehmen und dann das Dokument verarbeiten und die HTML-Daten zur Ausgabe eines Bilddokument verwenden. Zum Beispiel wird ein Benutzer eine URL anfordern, mit etwas Action = png im Abfragezeichenfolgeflag und dann wird der Filter für das URL und Ausgabebild Dokument erhalten aufgerufen.

Ich habe alles versucht, aber in meiner Umgebung (Websphere), ich bin zur Ausgabe eines Typs nur in der Lage. Wenn der Eingabetyp text / html ist, dann kann ich nur dann ausgegeben, ein Textdokument, kann ich nicht ein binäres Dokument zur Ausgabe erscheinen. Warum? Weil ich eine illegalen Zustand Ausnahme jedes Mal erhalten.

[1/29/09 17: 59: 57: 576 EST] 00000020 SystemErr R java.lang.IllegalStateException: SRVE0209E: Schriftsteller bereits erhalten [1/29/09 17: 59: 57: 576 EST] 00000020 SystemErr R bei com.ibm.ws.webcontainer.srt.SRTServletResponse.getOutputStream (SRTServletResponse.java:505)

Ich bin mit Pseudo-Code nicht alle meine Code zu offenbaren:

<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>

Der Wrapper-Klasse-Code ist im Wesentlichen so aus:

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; 
    }
}

Und der Filtercode ist dies:

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.

Der Code funktioniert, wenn ich eine Eingabe von HTML-Text-Dokument zu nehmen. Ich gehe davon aus, weil die offenen Printwriter-Stream. Aber Ich habe Probleme in ein anderes Format gehen. Im Grunde genommen, weil ich nicht nennen response.getOutputStream ()

War es hilfreich?

Lösung

Das Problem scheint zu sein, dass Sie die Antwort Writer vor dem Wickeln die Antwort öffnen.

Es sieht aus wie Sie in der Lage sein sollten, zu tun:

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

Sie können auf jeden Fall nicht sicher öffnen sowohl die Writer und der Output

Andere Tipps

Ich habe keine Erfahrung mit Websphere, aber ein gemeinsames Problem ist, dass Sie versuchen, den HTTP-Header zu manipulieren, nachdem Sie bereits zum Senden des Körpers verpflichtet - sobald der Webserver den Inhalt zu liefern begonnen, Sie nicht die Header nicht mehr aktualisiert werden kann, da sie haben bereits gesendet.

Vielleicht müssen Sie Ihre Dokumentation und Beispiele überprüfen. Zum Beispiel sehe ich nicht, warum Sie response.get * (), ohne tatsächlich Blick auf das Ergebnis nennen. Sind Sie sicher, dass dies notwendig ist, oder ist dies, weil Sie Ihren Code getrimmt?

Cheers,   Volker

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top