Comment savoir si l'utilisateur a cliqué sur annuler lors d'un téléchargement à partir d'une servlet Java? Ce qui semble se passer pour moi avec IE, le flux de sortie des blocs println(). Le hit utilisé est annulé, mais y a-t-il un moyen de temporiser cela ou quelque chose comme ça?Comment pouvez-vous dire si l'utilisateur a cliqué sur annuler lors d'un téléchargement à partir d'une servlet Java?
Répondre
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é.
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é.
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. –
quelle serait la classe d'exception exacte? (Je suis paresseux pour ouvrir quelques fichiers journaux pour voir :)) – Bozho
@Bozho: J'ai ajouté quelques détails supplémentaires lors d'une modification rapide. C'est spécifique au servletcontainer. – BalusC
Ainsi, le fait de dire que write écrit une exception, quand il bloque, en raison de l'annulation d'un utilisateur. –