Desidero creare un filtro Servlet che leggerà il contenuto della risposta dopo che è stato elaborato e completato e restituirà tali informazioni in formato XML o PDF o altro. Ma non sono sicuro di come ottenere informazioni dall'oggetto HttpServletResponse. Come posso ottenere queste informazioni?Come posso leggere un flusso di output HttpServletReponses?
risposta
Aggiungere questo al file del 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();
}
}
Utilizzare il codice seguente:..
HttpServletResponse httpResponse = (HttpServletResponse) response;
MyHttpServletResponseWrapper wrapper =
new MyHttpServletResponseWrapper(httpResponse);
chain.doFilter(request, wrapper);
String content = wrapper.toString();
La variabile contenuto ha ora il flusso di uscita È anche possibile lo fa per i contenuti binari
Non so se sia possibile ottenere dati da un oggetto HttpServletResponse come tale. Potrebbe avere più senso strutturare la tua applicazione in modo tale che le richieste vengano inoltrate ai gestori appropriati e trasmesse con gli oggetti di trasferimento dati, dai quali è possibile costruire la risposta finale appropriata. In questo modo, non modificherai mai più di un oggetto risposta o dovrai leggerne.
Non una risposta diretta, lo so, ma è così che lo farei dare la domanda.
In definitiva, farei la stessa cosa e mi metterei in una posizione in cui non avrei dovuto leggere per la risposta. Ma l'elaborazione richiesta effettiva che sto usando è abbastanza nera e non può essere modificata:/ – DyreSchlock
Non credo che si possa fare necessariamente questo dato che scrivere sul flusso di output può far sì che i dati vengano svuotati al client prima che qualsiasi filtro servlet venga invocato post-popolazione. Come suggerisce iftrue, sarebbe consigliabile un'architettura diversa, per generare il tuo XML (ad esempio) e quindi rigenerare in qualsiasi formato di output desideri.
EDIT: Dopo aver letto la tua risposta a iftrue s' invio, se davvero non può interferire con l'elaborazione in corso, forse è necessario un servlet per delega la richiesta, catturare l'output dall'uscita originale, e poi munge come appropriato. Molto brutto, però :-(
Spring dispone ora di una funzionalità. Tutto ciò che devi fare è utilizzare [ContentCachingResponseWrapper], che ha metodo public byte [] getContentAsByteArray().
I Suggerisco di rendere WrapperFactory che consenta di renderlo configurabile, se utilizzare ResponseWrapper predefinito o ContentCachingResponseWrapper.
- 1. Come leggere un flusso di input http
- 2. Come leggere un flusso nodejs in angolare?
- 3. Come posso ottenere un riferimento a un flusso di output che scrive nella finestra "output" di Visual Studio?
- 4. C++ collega il flusso di output al flusso di input
- 5. Scrittura sul flusso di output dall'azione
- 6. Scrittura della stringa sul flusso di output
- 7. Come leggere un intero flusso di testo in node.js?
- 8. C++ flusso di output personalizzato con rientranza
- 9. Come leggere pdf flusso in angularjs
- 10. Come posso leggere esattamente 128 byte da un flusso in un oggetto stringa?
- 11. Come posso modificare il flusso di output di marshalling JAXB per includere XML in linea arbitrario?
- 12. Come leggere i byte come flusso in python 3
- 13. come posso leggere un file YAML?
- 14. Come posso scrivere un semplice programma di input/output JScript?
- 15. Come posso ottenere un flusso parallelo di Files.walk?
- 16. Formattazione il flusso di output, ios :: sinistra e ios :: diritto
- 17. Impossibile leggere oltre la fine del flusso
- 18. Devo chiudere il flusso di output del servlet?
- 19. Apertura di un flusso di file di output binario senza troncamento
- 20. Come posso leggere un file di testo senza bloccarlo?
- 21. Come posso leggere il contenuto di un URL con Python?
- 22. Creazione flusso di stream da un lungo flusso
- 23. Come posso intercettare il flusso audio su un dispositivo Android?
- 24. Come si aspetta che un flusso di rete abbia i dati da leggere?
- 25. Java invia traccia di stack su un diverso flusso di output
- 26. Come posso calcolare la mediana e la deviazione standard di un flusso di numeri in Perl?
- 27. Come posso "accumulare" un flusso non elaborato in Node.js?
- 28. Come leggere un flusso tcp in entrata finché non viene trovato un delimitatore?
- 29. Posso leggere un file .TXT con PHP?
- 30. Come implementare un flusso Java?
Sì, usare un Servlet Reponse Wrapper e catturare l'output quando è scritto è il modo migliore per farlo, penso. – DyreSchlock
Il codice che gestisce la richiesta utilizza comunque il flusso di output. È possibile utilizzare TeeOutputStream. (http://commons.apache.org/io/apidocs/org/apache/commons/io/output/TeeOutputStream.html) – DyreSchlock
qual è il valore ragionevole di "BUFFER_SIZE"? – asgs