Frage

Ich möchte sehen, wie Web-Entwickler die doppelte Vorlage Problem vermeiden. Also im Grunde meines Verständnis des Problems ist wie folgt:

Doppelte Vorlage tritt auf, wenn ein ungeduldiger Benutzer sendet eine Form mehrfach, Probleme zu verursachen. Dieses Problem kann durch JavaScript behoben werden (speziell jQuery-Skripte), die den Absenden-Button deaktivieren, sobald das Formular abgeschickt wurde - eine Schwäche dafür ist, wenn Kunden haben JavaScript deaktiviert.

Es gibt auch serverseitige Methoden zur Erkennung.

Also meine Fragen sind:

Wie überwinden Menschen doppelt Unterwerfung? Was ist ein richtiges Beispiel eines Problems durch doppelt abgeschickt verursacht? Führen Sie einen Web Application Frameworks Doppel Vorlage Werkzeuge eingebaut?

War es hilfreich?

Lösung

Wenn Sie mit Java-Server-Side-Scripting arbeiten und auch mit Streben 2 dann verweisen Sie auf diesen Link, die Gespräche über zur Verwendung eines Token.

http://www.xinotes.org/notes/note/369/

Ein Token sollte in der Sitzung für die erste Seite übertragen, erzeugt und gehalten werden, wenn der Antrag zusammen mit dem Token zum ersten Mal vorgelegt wird, in Aktion Strebt ein Gewinde mit Gewinden Namen wie das Token-ID laufen und die Logik läuft unabhängig der Kunde hat für angefordert, wenn der Client den gleichen Antrag stellt, überprüfen Sie, ob der Thread noch läuft (thread.getcurrentthread (). unterbrochen), wenn dann noch eine Client-Umleitung 503 sendet ausgeführt wird.

Schauen Sie bitte auf der ExecuteAndWaitInterceptor Streben 2code, die Logik dieser mit Token kombiniert wird schnell aushelfen klicken

Andere Tipps

Die wirkliche Leben Situation: Wetten auf einer Wett Website setzt. Benutzer würden Klick verdoppeln und zwei Einsätze bekommen platziert. Nicht gut! Javascript Kontrollen nicht ausreichten, um dies zu verhindern.

Lösung:

  1. Erstellen Sie UUID / GUID versteckt Eingang in Form serverseitige Skriptsprache, die die Form macht.

  2. Formulareinreichung sofort die genannte UniqueSubmissions zu einer Datenbanktabelle hinzufügen (zum Beispiel). Dann fahren Sie mit der Verarbeitung.

  3. Jede nachfolgende Anforderung mit dem gleichen UUID / GUID wird, wenn in der UniqueSubmissions Tabelle gefunden abgelehnt.

Das ist für uns gearbeitet. Hoffnung, dass Ihre Frage hilft beantworten!

Mit dem Redirect-after-post oder manchmal auch als PRG (Post / Redirect / get)

Kurz gesagt, wenn der Benutzer Beiträge die Form, führen Sie einen Client-Seite Redirect (nach den Post-Daten raubend) auf die Antwort (Erfolg) Seite.

Ein richtiges Beispiel wäre diese Antwort geschrieben zweimal ;-). Wenn Sie nicht auf jedem Aspekt der Client-Seite verlassen wollen (Javascript, oder sogar Cookies), können Sie einen MD5-Hash der Daten vorgelegt, möglicherweise durch Hinzufügen von Informationen wie Quell-IP und dem Browser verwendet, und lehnen Beiträge berechnen die haben den gleichen Hash.

Die web2py Rahmen hat ein eingebauter Schutz gegen doppelte Form Unterwerfung. Er speichert eine einmalige in der Session-Token sowie in einem versteckten Feld in der Form, und sie müssen nach Vorlage übereinstimmen oder die Vorlage abgelehnt wird. Diese Methode wird auch schützt vor CSRF (Cross-Site Request Forgery).

Wenn das Formular eine Absicht der Bereitstellung einer Schnittstelle für einige Daten in Server dbms zu speichern, können Sie spezielle Revisionsfeld verwenden, die für übermittelten Daten ist obligatorisch. Eine Überprüfung, ob die vorgelegten Revision entspricht der die neuesten Version der Daten in der Datenbank (oder ist das von einem neues Stück von Daten eingefügt werden), könnten Sie mit einem guten Kontrolle über das, was, wenn mehrere vorträgt tun gemacht werden in Folge.

Mit Streben Web-Applikations-Framework wir dieses Problem umgehen können, wie folgt:

Struts hat drei Methoden für den token, saveToken(), isTokenValid() and resetToken() verwenden.

saveToken() - erzeugen den Token-Schlüssel und speichert auf Wunsch / session Attribut
. isTokenValid() - validate vorgelegt Token Schlüssel vor dem 1 Geschäft im Anfrage- / Sitzung
. resetToken() - setzen Sie die Token-Schlüssel.

Wie es funktioniert:
1) Nach dem Laden des Formulars, saveToken() Invokes auf der Action-Klasse zu erstellen und speichern Sie die Token-Schlüssel. Struts wird die generierte Schlüssel in Anforderungs- / Sitzung speichern. Wenn das Token erfolgreich erstellt, wenn Ansicht Quelle auf dem Browser, den Sie etwas ähnlich der folgenden sehen werden, der Token-Schlüssel wird als ein verstecktes Feld gespeichert:

<form action="myaction.do" method="post"> 
 <input type="hidden" 
 name="<%= Constants.TOKEN_KEY %>" 
 value="<%= session.getAttribute(Action.TRANSACTION_TOKEN_KEY) %>" > 

2) Sobald das Formular abgeschickt ruft auf der Action-Klasse isTokenValid(), wird den eingereichten Token Schlüssel (verstecktes Feld) mit dem Token Schlüssel zuvor auf Anfrage / Sitzung gespeichert validieren. Wenn Spiel, wird es wahr zurück.

public final ActionForward perform(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response)
throws IOException, ServletException {
    saveToken(request);
    if (!tokenIsValid(request)) {
        //forward to error page saying "your transaction is already being processed" 
    } else {
        //process action 
        //forward to jsp 
    }
    // Reset token after transaction success. 
    resetToken(request);
}

Referenz

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top