Подтвердить что ты не робот

Как передать данные между запросами шаблона 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 в этом случае?

4b9b3361

Ответ 1

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

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

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

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

HttpServletRequest.getHeader("Referer")

Ответ 2

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

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

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

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