Question

Cela peut paraître un peu déroutant, mais j’ai des problèmes. Mon objectif est de prendre un document HTML d'entrée, puis de le traiter et d'utiliser les données HTML pour générer un document image. Par exemple, un utilisateur demandera une URL, avec action = png dans la chaîne de requête, puis le filtre sera appelé pour l'URL et le document d'image en sortie.

J'ai tout essayé, mais dans mon environnement (Websphere), je ne peux sortir qu'un seul type de sortie. Si le type d'entrée est text / html, je ne peux que générer un document texte, mais il semble impossible de générer un document binaire. Pourquoi? Parce que je reçois à chaque fois une exception d'état illégale.

[29/01/09 17: 59: 57: 576 EST] 00000020 SystemErr R java.lang.IllegalStateException: SRVE0209E: Writer déjà obtenu [29/01/09 17: 59: 57: 576 EST] 00000020 SystemErr R à l'adresse com.ibm.ws.webcontainer.srt.SRTServletResponse.getOutputStream (SRTServletResponse.java:505)

J'utilise un pseudo-code pour ne pas révéler tout mon code:

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

Le code de la classe d'emballage est essentiellement le suivant:

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

Et le code de filtre est le suivant:

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.

Le code fonctionne si je veux utiliser un document texte HTML d'entrée. Je suppose en raison du flux open printwriter. Mais j'ai du mal à passer à un format différent. Fondamentalement, parce que je ne peux pas appeler response.getOutputStream ()

Était-ce utile?

La solution

Le problème semble être que vous ouvrez la réponse Writer avant de l'envelopper.

Il semble que vous devriez pouvoir faire:

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

Vous ne pouvez certainement pas ouvrir en toute sécurité Writer et OutputStream

Autres conseils

Je n'ai aucune expérience de Websphere, mais l'un des problèmes courants est que vous essayez de manipuler l'en-tête HTTP après vous être déjà engagé à envoyer le corps. Une fois que le serveur Web a commencé à fournir le contenu, vous ne pouvez plus mettre à jour les en-têtes car ils ont déjà été envoyés.

Peut-être devez-vous revoir votre documentation et vos exemples. Par exemple, je ne vois pas pourquoi vous appelez response.get * () sans regarder le résultat. Êtes-vous sûr que cela est nécessaire ou est-ce parce que vous avez corrigé votre code?

Salut,   Volker

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top