Jak przekazać dane między żądaniami wzoru Post / Redirect / Get w Spring MVC?

Mam formularz, który podaje imię i nazwisko Użytkownika za pomocą POST signin.html

 @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;
 } 

W celu rozwiązania problemu podwójnego przesłania Przekierowuję do tego samego mapowania za pomocą żądania GET.

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

W ten sposób rozwiązuję problem double submit.

Mam kilka pytań:

1) Skąd mogę wiedzieć, że GET request on / signin.html pochodzi z przekierowania i nie został poproszony przez użytkownika w przeglądarce? Po prostu chciałbym zamknąć opcję dla użytkownika do przeglądania http://server/signin.html i aby otrzymać komunikat "poprawnie przesłany". Wiem, że mogę dodać coś w stylu / signin.html?submitted = true,

2) Czy Jest jakiś sposób, aby przekazać ModelAndView obiekt z submit() do submitPRG()?

Czy po prostu jest jakiś inny sposób na użycie PRG w tym przypadku?

Author: BalusC, 2011-03-08

2 answers

Skąd mogę wiedzieć, że prośba o / signin (stacja kolejowa)html pochodzący z przekierowania i nie został poproszony przez użytkownika w przeglądarce?

  • możesz zapisać znacznik w ich sesji
  • spójrz na referer w nagłówku HTTP

Zalecałbym użycie jakiegoś rodzaju wiadomości opartych na sesji dla wiadomości "przesłanej poprawnie". Jest to czasami nazywane "błyskiem". StackExchange używa ich cały czas (wiadomości, które pojawiają się u góry ekran).

Z góry dziękuję, ale jak Mogę Pobierz referrer z HttpServletRequest?
HttpServletRequest.getHeader("Referer")
 4
Author: three-cups,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-03-08 17:26:05

Pożądane zachowanie nazywa się "Flash scope". Jest to zwykle realizowane przez przechowywanie wiadomości, które mają być wyświetlane po przekierowaniu w sesji.

Spring team obiecuje wdrożyć go wiosną 3.1 ( SPR-6464 ). Tymczasem możesz rzucić okiem na implementację zakresu flash w mvc-showcase sample, jest to dość proste, więc możesz to zrobić sam.

Alternatywnym podejściem jest dodanie wymaganych danych jako parametrów do przekierowania adresu URL. Zauważ, że jeśli twoja metoda submit zapisuje obiekt modelu, aby mógł być później dostępny przez jakiś identyfikator, sensowne jest przekierowanie do strony, która wyświetla ten obiekt (tzn. /users.html?userId=... zamiast /signin.html) i wyświetlenie komunikatu "poprawnie wysłane"na tej stronie z zakresu flash.

Tak więc, zakres flash jest zwykle używany do przekazywania wiadomości, a nie obiektów modelowych.

 17
Author: axtavt,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-03-08 15:54:34