2008-09-26 7 views
24

Angenommen, ich klicke auf eine Schaltfläche auf einer Webseite, um eine Übermittlungsanfrage zu starten. Dann merke ich plötzlich, dass einige Daten, die ich zur Verfügung gestellt habe, falsch sind und dass, wenn sie eingereicht werden, ich mit ungewollten Konsequenzen konfrontiert werde (etwas wie eine Einkaufsanfrage, bei der ich gezwungen sein könnte, diese falsche Anfrage zu bezahlen).Was passiert, wenn ich im Browser auf die Schaltfläche Stop klicke?

Also klicke ich verzweifelt auf die Stop-Taste nicht nur einmal, sondern viele Male (nur für den Fall).

Was passiert in einem solchen Szenario? Sendet der Browser die Anfrage einfach ab, ohne den Server zu informieren? Falls es den Server informiert, tötet der Server nur den Prozess oder führt er auch ein Rollback aller Aktionen durch, die als Teil dieser Anfrage ausgeführt wurden?

Ich Code in Java. Verfügt Java über eine spezielle Funktion, mit der wir STOP-Anfragen erkennen und zurücksetzen können, was auch immer wir als Teil dieser Transaktion gemacht haben?

Antwort

3

Im Allgemeinen wird der Server nicht wissen, dass Sie auf Stopp geklickt haben, und der serverseitige Prozess wird abgeschlossen. An dem Punkt, an dem der Server versucht, die Antwortdaten zurück an den Client zu senden, können Sie einen Fehler anzeigen, da die Verbindung geschlossen wurde, aber ebenso nicht. Was Sie nicht bekommen, ist der Server-Thread, der plötzlich unterbrochen wird.

Sie können verschiedene aufwendige Mechanismen verwenden, um dies abzuschwächen, wie Senden häufige Ajax-Aufrufe an den Server senden, die "noch warten" sagen, und den Server die Verarbeitung in einem neuen Thread, der diese Aufrufe überprüft, aber das löst das Problem nicht vollständig.

1

Der Client beendet sofort die Datenübertragung und schließt die Verbindung. In 9 von 10 Fällen ist Ihre Anfrage bereits angekommen (vielleicht weil OS-Puffer auf den Server "geleert" wurden). Es werden keine zusätzlichen Informationen an den Server gesendet, die ihn darüber informieren, dass Sie Ihre Anfrage abgebrochen haben.

+0

Wenn dies während einer Live-TCP-Verbindung zum Server auftritt, wird der Browser einen Reset senden ? – seand

0

Ihr Antrag in wichtigen Szenarien sollte zwei Stufen haben. Überprüfen und übermitteln Wenn die endgültige Übermittlung jedoch abgeschlossen ist, werden alle Transaktionen ausgeführt. Ich kann mir keine andere Möglichkeit vorstellen, diese Situation wirklich zu vermeiden, als dem Benutzer zu erlauben, seine Aktionen nach einem Commit rückgängig zu machen. Beispiel: Das Bestellbeispiel nach der Bestellung, damit Ihre Kunden ihre Meinung ändern und die Bestellung ändern können, wenn sie noch nicht versandt wurde. Natürlich muss man extra Code schreiben, um das zu schreiben.

21

eine Webseite laden von einem Browser (ohne Berücksichtigung von Umleitungen) ein 4-Schritt-Verfahren ist in der Regel:

  1. Browser sendet HTTP-Request, wenn der Server verfügbar ist
  2. Server führt Code (für dynamische Seiten)
  3. Server sendet die HTTP-Response (in der Regel HTML)
  4. Browser rendert HTML, und bittet um weitere Dateien (Bilder, CSS, ...)

Der Browser Reaktion auf „Stop“ ist abhängig von der Schritt Ihre Anfrage zu diesem Zeitpunkt:

  • Wenn der Server langsam oder überlastet ist, und Sie treffen „Stop“ während Schritt 1, passiert nichts. Der Browser sendet die Anfrage nicht.
  • In den meisten Fällen wird jedoch "Stop" in den Schritten 2, 3 und 4 gedrückt, und in diesen Schritten wird Ihr Code bereits ausgeführt, der Browser wartet einfach nicht mehr auf die Antwort (2) oder empfängt die Antwort (3), oder rendering die Antwort (4).

Der HTTP-Aufruf selbst ist immer eine 2 Schritte Aktion (Request/Response), und es gibt keine automatische Möglichkeit, die Ausführung von dem Client

12

Da diese Frage anziehen können Rollback Aufmerksamkeit für die Menschen nicht mit Java Ich dachte, ich würde PHPs Verhalten in Bezug auf diese Frage erwähnen, da es sehr überraschend ist.

PHP intern verwaltet einen Status der Verbindung zum Client. Die möglichen Werte sind NORMAL, ABORTED und TIMEOUT. Während der Verbindungsstatus NORMAL ist, ist das Leben gut und das Skript wird weiterhin wie erwartet ausgeführt.

Wenn der Benutzer in seinem Browser auf die Schaltfläche Stop klickt, wird die Verbindung normalerweise vom Client geschlossen und der Status ändert sich zu ABORTED. Eine Statusänderung in ABORTED beendet die Ausführung des laufenden Skripts sofort. Abgesehen davon passiert das Gleiche, wenn sich der Status in TIMEOUT ändert (PHPs-Einstellung für die zulässige Laufzeit von Skripten ist überschritten).

Dieses Verhalten kann unter bestimmten Umständen nützlich sein, aber es gibt andere, wo es problematisch sein könnte. Es scheint, dass es sicher sein sollte, jederzeit während einer ordnungsgemäßen GET-Anfrage abzubrechen; Wenn Sie jedoch mitten in einer Anfrage, die eine Änderung auf dem Server vornimmt, den Vorgang abbrechen, kann dies zu unvollständigen Änderungen führen.

überprüfen Sie das PHP-Handbuch vor dem Einstieg in Verbindung heraus Handhabung zu sehen, wie Komplikationen, die aus diesem Verhalten resultieren zu vermeiden:

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