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

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


person danny.lesnik    schedule 08.03.2011    source источник


Ответы (2)


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

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

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

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

HttpServletRequest.getHeader("Referer")
person three-cups    schedule 08.03.2011
comment
Заранее спасибо, но как я могу получить реферер из HttpServletRequest? - person danny.lesnik; 08.03.2011

Поведение, которое вы хотите, называется "flash scope". Обычно это реализуется путем сохранения сообщения, которое будет отображаться после перенаправления в сеансе.

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

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

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

person axtavt    schedule 08.03.2011