Как передавать данные между запросами шаблона Post / Redirect / Get в Spring MVC? - PullRequest
13 голосов
/ 08 марта 2011

У меня есть форма, которая отправляет имя и фамилию пользователя, используя 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;
 } 

Чтобы решить проблему двойной отправки, я перенаправляю на то же отображение с помощью запроса GET.

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

Таким образом, я решаю проблему двойной отправки.

У меня есть несколько вопросов:

1) Как я могу узнать, что запрос GET для /signin.html поступил из перенаправления и не был запрошен пользователем в браузере?Я просто хотел бы закрыть опцию для пользователя, чтобы просмотреть http://server/signin.html и получить сообщение «Отправлено правильно».Я знаю, что могу добавить что-то вроде /signin.html?submitted=true, но я бы хотел сделать его более чистым.

2) есть ли способ передать объект ModelAndView из submit() в submitPRG()?

Или просто есть какой-то другой способ использовать PRG в этом случае?

Ответы [ 2 ]

17 голосов
/ 08 марта 2011

Требуемое поведение называется «область действия флэш». Обычно это реализуется путем сохранения сообщения, которое будет отображаться после перенаправления в сеансе.

Spring Team обещает реализовать это в Spring 3.1 ( SPR-6464 ). Между тем вы можете взглянуть на реализацию flash scope в mvc-showcase sample, это довольно просто, так что вы можете сделать это самостоятельно.

Альтернативный подход заключается в добавлении необходимых данных в качестве параметров для перенаправления URL. Обратите внимание, что если ваш метод submit сохраняет объект модели, чтобы впоследствии к нему мог получить доступ какой-либо идентификатор, имеет смысл перенаправить на страницу, которая отображает этот объект (т. Е. /users.html?userId=... вместо /signin.html), и отобразить «Отправлено правильно». "сообщение на этой странице из области флеш-памяти.

Итак, область видимости flash обычно используется для передачи сообщений, а не объектов модели.

4 голосов
/ 08 марта 2011

Как узнать, что GET-запрос к /signin.html поступил от перенаправления и не был запрошен пользователем в браузере?

  • Вы можете сохранить маркер в их сеансе
  • Посмотрите на реферер в заголовке HTTP

Я бы порекомендовал использовать какой-либо сеанс обмена сообщениями для сообщения "Отправлено правильно".Это иногда называют «вспышкой».StackExchange использует их все время (сообщения, которые появляются в верхней части экрана).

Заранее спасибо, но как я могу получить реферера от HttpServletRequest?

HttpServletRequest.getHeader("Referer")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...