Mehrfachsendungen von Web-Formularen verhindern

Vor kurzem habe ich über den Hub logs gegangen und Beheben von Problemen, die entstehen Ausnahmen in der Anwendung ausgelöst werden müssen.

Ein besonders hat mich ratlos für eine Weile. Eine Ausnahme wurde bei dem Versuch, einen Server aus der Hub unregister erhöht, aber der Server nicht in der Datenbank vorhanden – in der Theorie ist dies unmöglich und sollte nie passieren.

Die einzige Erklärung, die ich tun konnte, war, dass das Formular wurde mehrfach gestellt. Getestet habe ich meine Theorie durch einen Doppelklick auf den Absenden-Button, und lo-and-siehe, die Ausnahme ausgelöst wurde.

Nun wußte ich die Ursache, sondern wie man es lösen?

Eine Möglichkeit ist, die Situation auf dem Server verarbeiten, aber das würde viele hässliche und komplexe Fehlerprüfcode der ganzen Anwendung hinzuzufügen.

Die zweite Möglichkeit ist, um es auf der Client-Seite umgehen, indem Sie die Schaltfläche Senden, nachdem es angeklickt wird, dann das Formular abschicken. Es stellt sich heraus, das ist recht einfach durch die Nutzung der onclick-Ereignis zu tun.

<input value="Unregister" type="submit" onclick="this.disabled=true,this.form.submit();"/>

Der Hub hat derzeit etwa 50 bildet, und die Aktualisierung jeweils manuell wäre ziemlich mühsam und fehleranfällig, so dass ich batched es:

$ find ./ -type f | xargs sed -i "s|type=[\"\']submit[\"\']|type=\"submit\" onclick=\"this.disabled=true,this.form.submit();\"|"]

Gotcha: Wenn Sie bereits onclick oder JS-Bindungen, könnte dies zu unerwartetem Verhalten führen.