servlet httpservletrequest example ejemplo java http servlets

java - httpservletrequest - ¿Cómo puedo leer una secuencia de salida HttpServletReponses?



servlet java example (4)

Agregue esto al archivo de filtro 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(); } }

Usa el siguiente código:

HttpServletResponse httpResponse = (HttpServletResponse) response; MyHttpServletResponseWrapper wrapper = new MyHttpServletResponseWrapper(httpResponse); chain.doFilter(request, wrapper); String content = wrapper.toString();

La variable de contenido ahora tiene la secuencia de salida. También puedes hacerlo para contenido binario.

Quiero hacer un filtro de servlet que lea los contenidos de la respuesta después de que haya sido procesada y completada y devolver esa información en XML o PDF o lo que sea. Pero no estoy seguro de cómo obtener información del objeto HttpServletResponse. ¿Cómo puedo obtener esta información?


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

EDITAR: Después de leer su respuesta a la publicación de iftrue , si realmente no puede interferir con el procesamiento actual, tal vez necesite un servlet para proxy su solicitud, capture la salida de la salida original, y luego comience según corresponda. Muy desagradable, sin embargo :-(


No sé mucho que puede 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, da la pregunta.


Spring ahora tiene una característica para él. Todo lo que necesita hacer es usar [ContentCachingResponseWrapper], que tiene el método byte público [] getContentAsByteArray ().

Sugiero hacer WrapperFactory, que permitirá que sea configurable, ya sea que use ResponseWrapper o ContentCachingResponseWrapper por defecto.