Comment pouvez-vous dire si l'utilisateur a frappé annuler pendant un téléchargement à partir d'un servlet Java?
-
02-10-2019 - |
Question
Comment pouvez-vous dire si l'utilisateur a frappé annuler pendant un téléchargement à partir d'un servlet Java? Ce qui semble se produire pour moi avec IE, le flux de sortie des blocs println (). Le coup utilisé annuler, mais est-il un moyen de temps ceci ou quelque chose comme ça?
La solution
Wrap OutputStream#write()
, #flush()
et #close()
dans un bloc de try-catch
sur IOException
. Si vous êtes pris, il en général signifie que l'utilisateur final a annulé la demande.
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 souhaitez appeler flush()
après avoir écrit un seul bloc de données. Cette volonté en fait envoyer les données au client et la cause IOException
lorsque la prise sous-jacente est fermée.
Autres conseils
Vous ne serez pas en mesure de dire à coup sûr. Cela dépend de la façon dont votre conteneur de servlet est mis en œuvre.
Lorsque l'utilisateur touche « Annuler », le navigateur doit fermer le socket. Ce sera détectable par le serveur, bien sûr, mais si le serveur a le ServletOutputStream
« plumbed » directement au OutputStream
de la prise dépend de la mise en œuvre. Dans le cas contraire, un IOException
sera soulevé la prochaine fois que les servlets tentatives de données d'écriture.
Si les tampons de conteneurs sortie, le servlet pourrait juste terminer l'écriture de données et de ne jamais rien savoir se clochait.