2010-02-24 7 views
17

Qual è il modo migliore per evitare l'invio di moduli duplicati in primavera. Questo framework fornisce funzionalità speciali per gestire questo problema (ad esempio come Synchronizer Token in Struts)?Invio di moduli duplicati in primavera

+1

Questo non è specifico per qualsiasi framework, ma puoi evitare l'invio duplicato con jQuery. http://stackoverflow.com/questions/2830542/prevent-double-submission-of-forms-in-jquery/4473801#4473801 –

risposta

35

Ci sono diversi modi per evitare la doppia sostiene, che possono essere combinati:

  1. utilizzare Javascript per disable il pulsante pochi ms dopo scatto. Ciò eviterà che più invii siano causati da utenti impazienti che fanno clic più volte sul pulsante.

  2. Invia un reindirizzamento dopo l'invio, questo è noto come Post-Redirect-Get (PRG) pattern. Ciò eviterà l'invio di più segnalazioni da parte degli utenti che premono F5 sulla pagina dei risultati e ignorando il browser che avverte che i dati verranno rinviati, o navigando avanti e indietro dai pulsanti Indietro/Avanti del browser e ignorando lo stesso avviso.

  3. Genera un token univoco quando viene richiesta la pagina e inserisce sia l'ambito della sessione sia il campo nascosto del modulo. Durante l'elaborazione, controllare se il token è presente e quindi rimuoverlo immediatamente dalla sessione e continuare l'elaborazione. Se il token non è lì, quindi bloccare l'elaborazione. Ciò eviterà i suddetti tipi di problemi.

In primavera è possibile utilizzare come RedirectView attuazione del pattern PRG (come descritto al punto 2). Gli altri due punti devono essere implementati da soli.

+0

Ciao Ho applicato il modello PRG. funziona bene ma ho bisogno di passare un messaggio per ottenere il metodo come "User ID 1001 creato con successo". per questo ho una variabile di livello di classe controller che imposterà il suo valore al metodo post e lo otterrà nel metodo GET. Ciò creerà un problema per l'utente concorrente. Come posso evitare questo problema? –

+0

@Dhrumil: memorizzalo invece nella sessione o un cookie. – BalusC

+0

no, ci vuole un po 'più di tempo di elaborazione. Invece del nostro manuale, il framework di codifica dovrebbe fornire alcune funzionalità come i token che Struts2.0 fornisce come predefiniti. –

4

Basta fare un reindirizzamento dopo la pubblicazione. Dopo che l'inoltro di un modulo è andato a buon fine, quando si restituisce ModelAndView assicurarsi che la vista sia un RedirectView. Dal POV dell'utente, inviano il modulo e quindi vengono reindirizzati per creare un "GET" su un altro URL. In questo modo non si raddoppieranno.

Si noti che quando si utilizza una vista di reindirizzamento, gli attributi del modello vengono esposti nell'URL come parametri. Quindi potresti voler mantenere gli attributi il ​​più sottili possibile. Quello che faccio di solito è mostrare all'utente una pagina che in realtà non contiene alcuna informazione unica, solo un messaggio di "conferma".

Problemi correlati