Doppeltes Formular-Absenden in Spring-MVC verhindern

Jeder, der Web-Anwendungen erstellt oder betreibt, kennt es. Wenn ein Web-Formular nach 2 Sekunden noch nicht verarbeitet ist, klickt der Benutzer gerne ein weiteres mal auf den „Senden“-Button und erzeugt so einen weiteren Request. Da HTTP asynchron und verbindungslos ist, ist es gar nicht so einfach eine solche doppelte Formularversendung zu erkennen.

Session synchronisieren und Session-Form aktivieren

Im Spring-MVC lassen sich Formular-Requests bezüglich der Session synchronisieren. Dazu setzen wir das Controller-Attribut „synchronizeOnSession“ auf true. Es wird so verhindert, dass ein Formular nebenläufig verarbeitet wird.

setSynchronizeOnSession(true);

Ausserdem wird ein weiteres Controller-Attribut, und zwar „sessionForm“ auf true gesetzt, was Spring MVC dazu veranlasst, die Formulardaten in der Session zu speichern und, falls ein Formular doppelt abgesendet wurde, die Methode „handleInvalidSubmit(HttpServletRequest request, HttpServletResponse response)“ aufzurufen.

setSessionForm(true);

Falls jetzt ein Formular doppelt versendet wird, oder falls ein Benutzer ein Formular mit dem „zurück“-Button erneut anzeigen und absenden möchte, wird also nun „handleInvalidSubmit“ aufgerufen. Diese Methode lässt sich in unserem Controller überschreiben, um so zu bestimmen, wie sich der Controller im Falle einer doppelten Datensendung verhalten soll.

@Override
protected ModelAndView handleInvalidSubmit(HttpServletRequest request, HttpServletResponse response) throws Exception
{
    return new ModelAndView(getSuccessView()); // einfach weiter, da das Formular ja schon abgeschickt wurde
} 

Es muss übrigens nicht immer richtig sein, doppelte Formularversendungen zu verbieten. Wenn wir beispielsweise ein Suchformular erstellen, kann es sinnvoll sein, dem Nutzer zu erlauben, mit der Browser-Navigation zurück zum Formular zu gehen und eine Suche erneut abzuschicken.

Siehe hierzu auch: Doppeltes Formular-Absenden mit jQuery verhindern