Search code examples
springspring-mvcparameter-passingpost-redirect-get

How to pass data between requests of Post/Redirect/Get pattern in Spring MVC?


I have a form which submits user first and last name using 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;
 } 

In order to solve double submit problem I'm redirecting to the same mapping using GET request.

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

This way I solve double submit problem.

I have few questions:

1) How can I know that GET request on /signin.html coming from redirect and was not requested by user in browser? I just would like to close option for user to browse http://server/signin.html and to get "Submitted Correctly" message. I know that I can add something like /signin.html?submitted=true but I would like to make it more clean.

2) is there any way to pass ModelAndView object from submit() to submitPRG()?

Or simply is there any other way to use PRG in this case?


Solution

  • How can I know that GET request on /signin.html coming from redirect and was not requested by user in browser?

    • You can store a marker in their session
    • Take a look at the referer in the HTTP header

    I would recommend using some sort of session-based messaging for the "Submitted Correctly" message. This is sometimes called a "flash". StackExchange uses these all the time (the messages that appear at the top of the screen).

    Thank you in advance, but how can I get referrer from HttpServletRequest?

    HttpServletRequest.getHeader("Referer")