2012-02-29 10 views
6

Sto scavando nel web dopo aver risolto un problema questo pomeriggio @ lavoro in cui i cookie aggiunti a HttpServletResponse non venivano riflessi correttamente nelle intestazioni di risposta perché il nostro servlet aveva già recuperato il PrintWriter della risposta (cioè response.getWriter()) prima di aggiungere i cookie. Ora so che le best practice dettano che le modifiche all'intestazione di risposta (ad esempio impostando il tipo di contenuto, aggiungendo/modificando i cookie, ecc.) Devono essere fatte prima di una chiamata a getWriter() ma, quello che sto cercando è: Perché?Perché le intestazioni HttpServletResponse non possono essere aggiornate DOPO che viene chiamato getWriter()?

Abbiamo speculato sul motivo per cui il richiamo di PrintWriter blocca le intestazioni di risposta, ma perché le specifiche Servlet lo fanno in modo definitivo?

risposta

11

Sezione intestazioni SRV.5.2 del Java ™ Servlet Specification Version 2,4

da trasmettere con successo al client, le intestazioni devono essere impostati prima la risposta è impegnata. Le intestazioni impostate dopo il commit della risposta saranno ignorate dal contenitore servlet.

Quindi la specifica non menziona esplicitamente getWriter() con un effetto sull'impostazione delle intestazioni.

Tuttavia, l'implementazione del contenitore servlet potrebbe aver scelto di considerare la risposta come avvenuta una volta chiamato getWriter(). Questo è sottilmente differente.

In alcuni dei contenitori con cui ho lavorato viene visualizzato un avviso quando si tenta di impostare un'intestazione dopo che la risposta è stata inviata.

Vale sempre la pena chiamare il getWriter() il più tardi possibile, poiché si potrebbe desiderare di impostare la codifica dei caratteri, ecc., Che deve essere impostata prima che venga chiamato getWriter().

+0

Grazie Paul! Ciò ha senso. Quindi è probabile che Tomcat sia troppo zelante quando considerare le intestazioni chiuse per la modifica. Il mio errore è stato ipotizzare che tutti i dati che abbiamo scritto al corpo della risposta prima di chiamare out.flush() fossero essenzialmente non trasmessi, ma probabilmente non è così. Grazie ancora! –

+0

Bella risposta, e bella referenza. Grazie Paolo. –

3

Perché le intestazioni precedono il corpo in HTTP. Ecco perché sono chiamati "intestazioni". Se chiami getWriter() stai scrivendo nel corpo, quindi dopo è troppo tardi per iniziare a cambiare i valori dell'intestazione di risposta.

Problemi correlati