Spring MVC, ein Controller für „add“ und „update“, wenn setDisallowedFields mit?

StackOverflow https://stackoverflow.com/questions/826385

  •  05-07-2019
  •  | 
  •  

Frage

Also ich habe eine einfache Form, durch die bekam ich entweder „add“ ein neues Ding, oder „update“ eine bestehende Sache.

Was ich möchte, ist ein Controller zu haben, die sowohl das Hinzufügen und Aktualisierung verarbeiten kann. Am Anfang scheint dies einfach genug, bis ich das Problem der Verwendung setDisallowedFields in meinem InitBinder betrachten, so dass das Feld „ID“ ist nicht erlaubt, wenn eine neue Sache hinzufügen.

Zur Zeit habe ich zwei Controller mit dem, was identischem Code mit Ausnahme der InitBinder Methode sein könnte.

Irgendwelche Vorschläge oder Beratung? (Ich bin offen für das Argument, dass ich auch zwei Controller halten wollen, wenn Sie mir gute Gründe geben kann)

War es hilfreich?

Lösung

Eigentlich sollten Sie die „id“ -Feld nicht zulassen sowohl beim Hinzufügen und Aktualisierung. Ansonsten ein böswilliger Benutzer mit dem Wert des „id“ Anforderungsparameters einer Aktualisierungsanforderung manipulieren könnte und dadurch einen anderen Datensatz in den von der gezeigten Form einer Aktualisierung (vorausgesetzt, es gibt keine ACLs oder andere Domain-Level-Sicherheit).

Wenn Sie jedoch das Feld „ID“ einfach nicht zulassen, wird der Controller die ID als null, behandeln, die funktionieren wird beim Einsetzen, aber nicht bei der Aktualisierung (zB könnte es versuchen, einen neuen Datensatz einfügen, anstatt die Aktualisierung, je nachdem, was Persistenzmechanismus Sie verwenden). Sie wollen also die Steuerung die nicht editierbare Werte Ihrer Domain-Objekt (nicht nur IDs, aber alle nicht anerkannten Felder) zwischen den Anforderungen erinnern, so dass sie alle korrekten Werte der Dienstschicht oder andere Geschäftslogik senden. Dies geschieht, um die Typ-Ebene @SessionAttributes Anmerkung wie folgt verwendet (andere Anmerkungen zur Klarheit weggelassen):

@SessionAttributes("thing") // the name of your domain object in the model
public class ThingController {

    public void setDisallowedFields(WebDataBinder binder) {
        binder.setDisallowedFields("id", "someOtherUneditableField");
    }

    // request handling methods go here as before
}

Für eine noch bessere Sicherheit, stellen Sie die erlaubten Felder, anstatt die Nichtanerkennung der Felder. Wie auch immer Sie die @SessionAttributes Anmerkung müssen unabhängig von bestehenden Feldwerten zu füllen sind von der Anforderung ignoriert.

Andere Tipps

Die Methode Signatur initBinder nimmt im HttpServletRequest:

protected void initBinder(HttpServletRequest request, 
    ServletRequestDataBinder binder)

So können Sie vielleicht haben initBinder() die Anfrageparameter zu überprüfen, um festzustellen, ob Sie bedingt gesetzt setDisallowedFields sollte?

(Wenn dies nicht hilft, vielleicht bin ich nicht das Problem richtig zu verstehen ...)

So wie ich dies mit einem einzigen Controller ist ein boolean auf mein Kommando-Objekt haben die angibt, ob es sich um ein neues Objekt ist oder nicht. In onSubmit kann ich dann die boolean überprüfen, um zu sehen, ob ich brauche eine Add oder Update-Aktion auszuführen.

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