Spring MVC, un controller per & # 8220; aggiungi & # 8221; e & # 8220; aggiorna & # 8221; quando si utilizza setDisallowedFields?

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

  •  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)

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top