2011-03-08 28 views
13

Ho una forma che presenta all'utente nome e cognome utilizzando POST signin.htmlCome passare i dati tra le richieste di Post/Redirect/Get pattern in Spring MVC?

@RequestMapping(value="/signin.html",method = RequestMethod.POST) 
public ModelAndView submit(@Valid User user){ 
    ModelAndView mv = new ModelAndView("redirect:signin.html"); 
    //Business logic with user account 
    return mv; 
} 

Al fine di risolvere doppia inviare problema che sto reindirizzando alla stessa mappatura mediante richiesta GET.

@RequestMapping(value="/signin.html",method = RequestMethod.GET) 
public ModelAndView submitPRG(){ 
    ModelAndView mv = new ModelAndView("submitted"); 
    mv.addObject("message", "Submitted Correctly"); 
    return mv; 
} 

In questo modo risolvo il problema di invio doppio.

Ho poche domande:

1) Come faccio a sapere che vengono richiesta su /signin.html proveniente dal reindirizzamento e non è stato richiesto da utenti di browser? Vorrei solo chiudere l'opzione per l'utente per cercare http://server/signin.html e per ottenere il messaggio "Inviato correttamente". So che posso aggiungere qualcosa come /signin.html?submitted=true ma vorrei renderlo più pulito.

2) esiste un modo per passare l'oggetto ModelAndView da submit() a submitPRG()?

O semplicemente c'è un altro modo di utilizzare PRG in questo caso?

risposta

4

Come faccio a sapere che vengono richiesta su /signin.html proveniente dal reindirizzamento e non era richiesta dall'utente in browser?

  • È possibile memorizzare un marcatore nella loro sessione di
  • Date un'occhiata al referer nell'intestazione HTTP

mi consiglia di utilizzare una sorta di messaggistica session-based per la "Inserito "Correttamente". Questo è talvolta chiamato "flash". StackExchange li usa sempre (i messaggi che appaiono nella parte superiore dello schermo).

Grazie in anticipo, ma come posso ottenere referrer da HttpServletRequest?

HttpServletRequest.getHeader("Referer") 
+1

Grazie in anticipo, ma come posso ottenere referrer da HttpServletRequest? –

17

Il comportamento desiderato è denominato "ambito flash". Di solito viene implementato memorizzando il messaggio da visualizzare dopo il reindirizzamento nella sessione.

Il team Spring promette di implementarlo nella primavera 3.1 (SPR-6464). Nel frattempo puoi dare un'occhiata all'implementazione dell'ambito del flash nell'esempio mvc-showcase, è piuttosto semplice, quindi puoi farlo da solo.

L'approccio alternativo consiste nell'aggiungere dati obbligatori come parametri per il reindirizzamento dell'URL. Si noti che se il metodo di invio salva l'oggetto del modello in modo che possa essere successivamente richiamato da un identificatore, ha senso reindirizzare alla pagina che visualizza quell'oggetto (ad esempio /users.html?userId=... anziché /signin.html) e visualizzare il messaggio "Inviato correttamente" su quello pagina dall'ambito del flash.

Quindi, l'ambito del flash viene in genere utilizzato per passare i messaggi, non gli oggetti del modello.

+2

bisogna essere un po 'attenti uso del flash, tuttavia, come la sua consistenza temporale non è rigorosamente garantita.dai documenti di primavera: http://static.springsource.org/spring/docs/3.2.x/spring-framework-reference/html/mvc.html#mvc-flash-attributes Probabilmente non sarà un problema, ma è almeno qualcosa di cui essere a conoscenza. – sanimalp

Problemi correlati