10
votes

Comment fermer une connexion HTTP à partir du site httpServillet

Je gère un servlet à Tomcat 6.0.26. Le servlet accepte le téléchargement de fichier à partir du client par http Post. J'aimerais arrêter le téléchargement du fichier du côté httpServlet. J'ai essayé les méthodes suivantes sans chance:

  1. Fermer la requête Inpurstream
  2. Envoyer le code d'erreur HTTPServletResponse.Sc_Request_entity_too_large et rincer la réponse
  3. faire 1 et 2 dans un filtre

    J'ai googlé mais n'a trouvé aucune réponse directe. S'il vous plaît conseiller des solutions.

    merci.


0 commentaires

3 Réponses :


5
votes

Ceci n'est pas possible en utilisant le servlet standard ni les API Filedupload Filedupload. Fondamentalement, pour pouvoir abandonner immédiatement la connexion, vous devez saisir la prise sous-jacente physiquement et la fermer. Cependant, cette prise est contrôlée par le serveur Web. Voir aussi cette question connexe: Comment Terminez explicitement la connexion HTTP du serveur sans en-tête de réponse .

Les petits tests ont toutefois confirmé que les Commons Filedupload ne tamponnent pas l'ensemble du fichier en mémoire lorsque sa taille dépasse la limite. Il lira le flux d'entrée, mais ignore et jetez simplement les octets de lecture (aussi ceux qui sont déjà lus). Donc, l'efficacité de la mémoire n'est pas nécessairement le problème ici.

Pour résoudre le problème réel, vous souhaitez valider la taille du fichier du côté client plutôt que le côté serveur. Cela est possible avec un applet Java ou une application Flash. Par exemple, respectivement Jumploader et SWFUPLOAD .


0 commentaires

3
votes

Voici quelques solutions de contournement folle: vous pouvez écrire (ou trouver quelque part) une application autonome de pare-feu basé sur des sockets qui gère la requête HTTP, analyser les en-têtes et si la demande correspond à certaines conditions personnalisées - le pare-feu en transmet à Tomcat, sinon renvoie http réponse d'erreur. Ou vous pouvez essayer d'accorder Apache <-> Tomcat avec certaines règles Apache.


0 commentaires

4
votes

Ce n'est pas possible en utilisant des API standard. Et vous enfreignez certaines normes de protocole / RFC si vous le faites. Alors, pourquoi feriez-vous cela?

Au lieu de cela, envoyez une "connexion: fermeture" (en-tête HTTP) sans corps HTTP.


0 commentaires