2009-03-31 14 views

Respuesta

27

Esto, unido al filtro de archivos java

static class MyHttpServletResponseWrapper 
    extends HttpServletResponseWrapper { 

    private StringWriter sw = new StringWriter(BUFFER_SIZE); 

    public MyHttpServletResponseWrapper(HttpServletResponse response) { 
    super(response); 
    } 

    public PrintWriter getWriter() throws IOException { 
    return new PrintWriter(sw); 
    } 

    public ServletOutputStream getOutputStream() throws IOException { 
    throw new UnsupportedOperationException(); 
    } 

    public String toString() { 
    return sw.toString(); 
    } 
} 

Utilice el código siguiente:..

HttpServletResponse httpResponse = (HttpServletResponse) response; 
MyHttpServletResponseWrapper wrapper = 
    new MyHttpServletResponseWrapper(httpResponse); 

chain.doFilter(request, wrapper); 

String content = wrapper.toString(); 

El contenido variable ahora tiene la secuencia de salida También puede hacerlo por contenido binario.

+1

Sí, usar un Contenedor de respuesta de servlet y capturar la salida cuando está escrito es sobre la mejor manera de hacerlo, creo. – DyreSchlock

+1

Sin embargo, el código que maneja la solicitud usa la secuencia de salida. Se puede usar TeeOutputStream. (http://commons.apache.org/io/apidocs/org/apache/commons/io/output/TeeOutputStream.html) – DyreSchlock

+4

¿cuál es el valor razonable de 'BUFFER_SIZE'? – asgs

0

No sé mucho que pueda obtener datos de un objeto HttpServletResponse como tal. Puede tener más sentido estructurar su aplicación de forma tal que las solicitudes sean enviadas a los manejadores apropiados y transmitidas con objetos de transferencia de datos, a partir de los cuales puede generar la respuesta final apropiada. De esta manera, nunca modificas más de un objeto de respuesta o necesitas leer de ellos.

No es una respuesta directa, lo sé, pero así es como lo haría, daría la pregunta.

+1

Al final, haría lo mismo y me pondría en una posición en la que no tendría que leer para la respuesta. Pero el proceso de solicitud real que estoy usando es bastante negro y no se puede alterar:/ – DyreSchlock

1

No creo que necesariamente pueda hacer esto, dado que escribir en la secuencia de salida puede hacer que los datos se descarguen al cliente antes de invocar los filtros de servlet después de la población. Como iftrue sugiere, una arquitectura diferente sería aconsejable, para generar su XML (por ejemplo) y luego regenerar en cualquier formato de salida que desee.

EDIT: Después de haber leído su respuesta a ifTrue 's publicación, si realmente no puede interferir con el tratamiento actual, tal vez necesita un servlet de proxy a su solicitud, capturar la salida de la salida original, y luego munge según corresponda. Muy desagradable, sin embargo :-(

2

El resorte ahora tiene una característica para él. Todo lo que necesitas hacer es usar [ContentCachingResponseWrapper], que tiene un byte público de método [] getContentAsByteArray().

Sugiero que WrapperFactory permita que sea configurable, ya sea que use ResponseWrapper o ContentCachingResponseWrapper por defecto.

Cuestiones relacionadas