Spring MVC, un controller per & # 8220; aggiungi & # 8221; e & # 8220; aggiorna & # 8221; quando si utilizza setDisallowedFields?
-
05-07-2019 - |
Domanda
Quindi ho un semplice modulo attraverso il quale posso sia " aggiungere " una nuova cosa, o "aggiorna" una cosa esistente.
Quello che vorrei è avere un controller in grado di elaborare sia l'aggiunta che l'aggiornamento. All'inizio questo sembra abbastanza semplice, fino a quando non prendo in considerazione il problema dell'uso di setDisallowedFields nel mio InitBinder in modo che "id" sia " il campo non è consentito quando si aggiunge una nuova cosa.
Attualmente ho due controller con quello che potrebbe essere un codice identico ad eccezione del metodo InitBinder.
Qualche suggerimento o consiglio? (Sono aperto all'argomento secondo cui dovrei voler mantenere anche due controller, se puoi darmi delle buone ragioni)
Soluzione
In realtà, dovresti non consentire & id; id " sia durante l'aggiunta che nell'aggiornamento. Altrimenti un utente malintenzionato potrebbe manomettere il valore dell '"id" richiesta il parametro di una richiesta di aggiornamento e quindi aggiorna un record diverso da quello mostrato dal modulo (presupponendo che non vi siano ACL o altra sicurezza a livello di dominio).
Tuttavia, se non autorizzi semplicemente " id " campo, il controller tratterà l'ID come nullo, che funzionerà durante l'inserimento ma non durante l'aggiornamento (ad esempio, potrebbe provare a inserire un nuovo record invece di aggiornare, a seconda del meccanismo di persistenza che stai utilizzando). Quindi vuoi che il controller ricordi i valori non modificabili del tuo oggetto di dominio (non solo ID, ma tutti i campi non consentiti) tra le richieste in modo che possa inviare tutti i valori corretti al livello di servizio o ad altre logiche aziendali. Questo viene fatto usando l'annotazione @SessionAttributes a livello di tipo, come segue (altre annotazioni omesse per chiarezza):
@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
}
Per una sicurezza ancora migliore, imposta i campi consentiti anziché i campi non consentiti. In entrambi i casi è necessaria l'annotazione @SessionAttributes per compilare qualunque valore di campo esistente venga ignorato dalla richiesta.
Altri suggerimenti
La firma del metodo su initBinder
contiene HttpServletRequest
:
protected void initBinder(HttpServletRequest request,
ServletRequestDataBinder binder)
Quindi forse puoi avere initBinder ()
controllare i parametri di richiesta per determinare se devi impostare condizionalmente setDisallowedFields
?
(Se questo non aiuta, forse non capisco correttamente il problema ...)
Il modo in cui lo faccio con un singolo controller è di avere un valore booleano sul mio oggetto comando che indica se si tratta di un nuovo oggetto o meno. In onSubmit posso quindi controllare il valore booleano per vedere se devo eseguire un'azione di aggiunta o aggiornamento.