user871611
user871611

Reputation: 3461

Spring MVC Controller: Redirect without parameters being added to my url

I'm trying to redirect without parameters being added to my URL.

@Controller
...
public class SomeController
{
  ...
  @RequestMapping("save/")
  public String doSave(...)
  {
    ...
    return "redirect:/success/";
  }

  @RequestMapping("success/")
  public String doSuccess(...)
  {
    ...
    return "success";
  }

After a redirect my url looks always something like this: .../success/?param1=xxx&param2=xxx. Since I want my URLs to be kind of RESTful and I never need the params after a redirect, I don't want them to be added on a redirect.

Any ideas how to get rid of them?

Upvotes: 39

Views: 42224

Answers (6)

user7511364
user7511364

Reputation: 21

Try this:

public ModelAndView getRequest(HttpServletRequest req, Locale locale, Model model) {

    ***model.asMap().clear();*** // This clear parameters in url

    final ModelAndView mav = new ModelAndView("redirect:/test");

    return mav;
}

Upvotes: 2

Carrol
Carrol

Reputation: 1285

In Spring 4 there is a way to do this with java config, using annotations. I'm sharing it in case anyone needs it as I needed it.

On the config class that extends WebMvcConfigurerAdapter, you need to add:

@Autowired
private RequestMappingHandlerAdapter requestMappingHandlerAdapter;


@PostConstruct
public void init() {
    requestMappingHandlerAdapter.setIgnoreDefaultModelOnRedirect(true);
}

With this, you do not need to use RedirectAttributes, and it is an equivalent in java config to Matroskin's answer.

Upvotes: 9

Ilya Serbis
Ilya Serbis

Reputation: 22283

Adding RedirectAttributes parameter doesn't work for me (may be because my HandlerInterceptorAdapter adds some stuff to model), but this approach does (thanks to @reallynic's comment):

@RequestMapping("save/")
public View doSave(...)
{
    ...
    RedirectView redirect = new RedirectView("/success/");
    redirect.setExposeModelAttributes(false);
    return redirect;
}

Upvotes: 13

Matroskin
Matroskin

Reputation: 326

In Spring 3.1 use option ignoreDefaultModelOnRedirect to disable automatically adding model attributes to a redirect:

<mvc:annotation-driven ignoreDefaultModelOnRedirect="true" />

Upvotes: 31

Andrea Ligios
Andrea Ligios

Reputation: 50203

If you're using Spring 3.1, you can use Flash Scope, otherwise you can take a look at the method used in the most voted (not accepted) answer here:

Spring MVC Controller redirect using URL parameters instead of in response

EDIT:

Nice article for 3.1 users:

http://www.tikalk.com/java/redirectattributes-new-feature-spring-mvc-31

Workaround for non-3.1 users:

Spring MVC custom scope bean

Upvotes: 6

axtavt
axtavt

Reputation: 242686

In Spring 3.1 a preferred way to control this behaviour is to add a RedirectAttributes parameter to your method:

@RequestMapping("save/")
public String doSave(..., RedirectAttributes ra)
{
    ...
    return "redirect:/success/";
}

It disables addition of attributes by default and allows you to control which attributes to add explicitly.

In previous versions of Spring it was more complicated.

Upvotes: 34

Related Questions