2010-09-09 6 views

Répondre

4

Wrap OutputStream#write(), #flush() et #close() dans un bloc try-catch sur IOException. Si elle est interceptée, cela signifie généralement que l'utilisateur final a interrompu la requête.

Pour obtenir un peu plus loin, vous pouvez également prendre à une exception plus spécifique à servletcontainer comme ClientAbortException sur Tomcat et des clones (qui est une sous-classe de IOException), mais cela rendra votre code webapp à d'autres servletcontainers non portable.


Mise à jour: revenir sur la question de blocage, vous aimeriez appeler flush() après avoir écrit un seul bloc de données. Cela va effectivement envoyer les données au client et provoquer IOException lorsque le socket sous-jacent est fermé.

+0

quelle serait la classe d'exception exacte? (Je suis paresseux pour ouvrir quelques fichiers journaux pour voir :)) – Bozho

+0

@Bozho: J'ai ajouté quelques détails supplémentaires lors d'une modification rapide. C'est spécifique au servletcontainer. – BalusC

+0

Ainsi, le fait de dire que write écrit une exception, quand il bloque, en raison de l'annulation d'un utilisateur. –

2

Vous ne serez pas en mesure de dire à coup sûr. Cela dépend de la façon dont votre conteneur de servlets est implémenté.

Lorsque l'utilisateur clique sur "Annuler", le navigateur doit fermer le socket. Cela sera détectable par le serveur, bien sûr, mais si le serveur a le ServletOutputStream "plumbed" directement à OutputStream de la socket dépend de l'implémentation. Si c'est le cas, un IOException sera déclenché la prochaine fois que la servlet tentera d'écrire des données.

Si les tampons du conteneur sont sortis, le servlet peut terminer l'écriture des données sans jamais savoir que quelque chose a mal tourné.

+0

Donc, vous dites que si le tampon est assez grand, il n'y aura pas d'exception IOException, car l'écriture ne bloquera pas. Cependant, je suppose que la couleur pourrait alors bloquer. –

Questions connexes