Quiero hacer un filtro de servlet que lea el contenido de la respuesta después de que se haya procesado y completado 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?¿Cómo puedo leer una secuencia de salida HttpServletReponses?
Respuesta
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.
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.
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
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 :-(
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.
- 1. Cómo leer una secuencia de entrada http
- 2. ¿Cómo puedo obtener una referencia a una secuencia de salida que escribe en la ventana de "salida" de Visual Studio?
- 3. ¿Cómo puedo leer una secuencia de respuesta Http dos veces en C#?
- 4. Cómo leer la salida de sed en una variable
- 5. Java verbose: gc ¿Cómo leer la salida?
- 6. Boost iostreams: ¿Cómo crear una secuencia TCP tamponada (para leer)?
- 7. ¿Cómo puedo ejecutar una secuencia de comandos 'R' sin suprimir la salida?
- 8. Leer elementos completos de una secuencia de red XML
- 9. La forma más eficiente de leer datos de una secuencia
- 10. ¿Cómo puedo contar ejecuciones en una secuencia?
- 11. ¿Cómo puedo restablecer una secuencia factory_girl?
- 12. ¿Cómo puedo escribir una secuencia en WriteableBitmap?
- 13. ¿Cómo puedo crear una secuencia en SQLite?
- 14. ¿Cómo puedo sangrar la salida de salida?
- 15. Escribir cadena en la secuencia de salida
- 16. ¿Cómo puedo generar una secuencia a partir de una cadena?
- 17. Ubuntu Chrome: Cómo leer una cookie de una secuencia de comandos python
- 18. ¿Cómo puedo leer metadatos PNG de PHP?
- 19. Quiero convertir una secuencia de salida en el objeto String
- 20. ¿Cómo puedo modificar la secuencia de salida de clasificación JAXB para incluir arbitrariamente XML en línea?
- 21. ¿Cómo puedo probar una secuencia de comandos de Perl independiente?
- 22. ¿Cómo puedo leer una imagen desde una URL en Java?
- 23. ¿Cómo puedo crear un paquete en una secuencia de memoria?
- 24. ¿Cómo puedo eliminar un elemento de una secuencia en Clojure?
- 25. Cómo detener la suspensión de una secuencia de comandos zsh (salida de tty)
- 26. Cómo leer caracteres UTF-8 de una secuencia de bytes infinita - C#
- 27. ¿Cómo puedo leer una línea de entrada en Inform 7?
- 28. F #: ¿Cómo dividir una secuencia en una secuencia de secuencias
- 29. Cómo leer la salida del comando android process
- 30. C# - Cómo leer una secuencia continua de XML a través de HTTP
Sí, usar un Contenedor de respuesta de servlet y capturar la salida cuando está escrito es sobre la mejor manera de hacerlo, creo. – DyreSchlock
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
¿cuál es el valor razonable de 'BUFFER_SIZE'? – asgs