2008-09-26 7 views
24

Supposons que je clique sur un bouton d'une page Web pour lancer une demande de soumission. Ensuite, je réalise soudainement que certaines données que j'ai fournies sont fausses et que si elles sont soumises, alors je ferai face à des conséquences indésirables (quelque chose comme une demande d'achat où je serais obligé de payer pour cette demande incorrecte).Que se passe-t-il lorsque je clique sur le bouton Arrêter du navigateur?

Donc, je clique frénétiquement sur le bouton Stop non pas une fois mais plusieurs fois (juste au cas où).

Que se passe-t-il dans un tel scénario? Est-ce que le navigateur annule la requête sans en informer le serveur? Si dans le cas où il informe le serveur, le serveur tue-t-il le processus ou effectue-t-il aussi un recul de toutes les actions effectuées dans le cadre de cette requête?

Code I en Java. Java a-t-il une fonctionnalité spéciale que nous pouvons utiliser pour détecter les demandes STOP et annuler tout ce que nous avons fait dans le cadre de cette transaction?

Répondre

3

D'une manière générale, le serveur ne saura pas que vous avez atteint l'arrêt et le processus côté serveur se terminera. Au moment où le serveur essaie de renvoyer les données de réponse au client, vous pouvez voir une erreur car la connexion a été fermée, mais vous ne pouvez pas également. Ce que vous n'obtiendrez pas, c'est que le thread du serveur est soudainement interrompu. Vous pouvez utiliser différents mécanismes élaborés pour atténuer cela, comme avoir envoyé l'envoi envoyer des appels ajax fréquents au serveur qui dit "toujours en attente", et avoir le serveur effectuer son traitement dans un nouveau thread qui vérifie ces appels, mais que ne résout pas complètement le problème.

1

Le client arrêtera immédiatement la transmission de données et fermera sa connexion. 9 fois sur 10, votre requête sera déjà passée (peut-être parce que les tampons du système d'exploitation sont "vidés" sur le serveur). Aucune information supplémentaire n'est envoyée au serveur l'informant que vous avez arrêté votre demande.

+0

Si cela se produit lors d'une connexion tcp en direct sur le serveur, ce que le navigateur envoie une réinitialisation ? – seand

0

Votre soumission dans des scénarios importants doit comporter deux étapes. Vérifiez et soumettez. Si la soumission finale va bien, vous commettez des tranactions. Je ne peux pas vraiment penser à une autre façon d'éviter cette situation, si ce n'est de permettre à votre utilisateur d'annuler ses actions après un commit. par exemple L'exemple de commande, après que la commande soit faite pour permettre à vos clients de changer d'avis et de canaliser la commande si elle n'a pas encore été expédiée. Bien sûr, son code supplémentaire vous devez écrire à suuport cela.

21

Une charge page Web à partir d'un navigateur est généralement un processus en 4 étapes (sans tenir compte des redirections):

  1. navigateur envoie une demande HTTP, lorsque le serveur est disponible
  2. Server exécute le code (pour les pages dynamiques)
  3. serveur envoie la réponse HTTP (généralement HTML)
  4. navigateur rend HTML, et demande d'autres fichiers (images, css, ...)

La réaction du navigateur « Stop » dépend de l'étape de votre demande est à ce moment:

  • Si votre serveur est lent ou surchargé, et vous appuyez sur « Stop » lors de l'étape 1, rien ne se passe. Le navigateur n'envoie pas la requête.
  • La plupart du temps, cependant, "Stop" sera atteint aux étapes 2, 3 et 4, et dans ces étapes votre code est déjà exécuté, le navigateur arrête simplement d'attendre la réponse (2), ou de recevoir la réponse (3), ou rendre la réponse (4).

L'appel HTTP lui-même est toujours une action 2 étapes (requête/réponse), et il n'y a pas moyen automatique de rollback l'exécution du client

12

Étant donné que cette question peut attirer l'attention pour les personnes qui n'utilisent pas Java , Je pensais que je mentionnerais le comportement des PHPs en ce qui concerne cette question, car c'est très surprenant. PHP maintient en interne un état de la connexion au client en interne. Les valeurs possibles sont NORMAL, ABORTED et TIMEOUT. Alors que le statut de connexion est NORMAL, la vie est bonne et le script continuera à s'exécuter comme prévu.

Si l'utilisateur clique sur le bouton Arrêter dans son navigateur, la connexion est généralement fermée par le client et le statut devient ABORTED. Un changement de statut à ABORTED mettra immédiatement fin à l'exécution du script en cours d'exécution. En passant, la même chose se produit lorsque le statut passe à TIMEOUT (le paramètre PHPs pour l'exécution autorisée des scripts est dépassé).

Ce comportement peut être utile dans certaines circonstances, mais il y en a d'autres où cela peut poser problème. Il semble qu'il devrait être prudent d'annuler à tout moment au cours d'une demande GET appropriée; Cependant, interrompre au milieu d'une requête qui effectue une modification sur le serveur peut entraîner des modifications partiellement terminées.

Découvrez le d'entrée de manuel PHP sur la manipulation de connexion pour voir comment éviter les complications résultant de ce comportement:

http://www.php.net/manual/en/features.connection-handling.php

Questions connexes