Spring MVC-контроллер: перенаправление без добавления параметров в мой URL-адрес

Я пытаюсь перенаправить без добавления параметров в мой URL.

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

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

После перенаправления мой url всегда выглядит примерно так: .../success/?param1=xxx&param2=xxx. Поскольку я хочу, чтобы мои URL-адреса были вроде RESTful, и мне не нужны параметры после перенаправления, я не хочу, чтобы их добавляли в перенаправление.

Любые идеи, как избавиться от них?

Ответ 1

В Spring 3.1 используйте опцию ignoreDefaultModelOnRedirect, чтобы автоматически отключить атрибуты модели для перенаправления:

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

Ответ 2

В Spring 3.1 предпочтительным способом управления этим поведением является добавление к вашему методу параметра RedirectAttributes:

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

Он отключает добавление атрибутов по умолчанию и позволяет вам контролировать, какие атрибуты нужно явно добавлять.

В предыдущих версиях Spring это было более сложно.

Ответ 3

Добавление параметра RedirectAttributes не работает для меня (возможно, потому, что мой HandlerInterceptorAdapter добавляет некоторые вещи для модели), но этот подход делает (благодаря @reallynic comment):

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

Ответ 4

Если вы используете Spring 3.1, вы можете использовать Flash Scope, в противном случае вы можете взглянуть на метод, используемый в наиболее голосуемом (не принимаемом) ответе здесь:

Spring Контроллер MVC перенаправляется с использованием параметров URL вместо ответа

ИЗМЕНИТЬ:

Хорошая статья для пользователей 3.1:

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

Обходной путь для пользователей, не относящихся к 3.1:

Spring Пользовательская область MVC bean

Ответ 5

В Spring 4 есть способ сделать это с помощью java config, используя аннотации. Я делюсь ею, если кому-то это понадобится, поскольку мне это нужно.

В классе конфигурации, который расширяет WebMvcConfigurerAdapter, вам нужно добавить:

@Autowired
private RequestMappingHandlerAdapter requestMappingHandlerAdapter;


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

При этом вам не нужно использовать RedirectAttributes, и это эквивалент в java config для ответа Matroskin.

Ответ 6

Попробуйте следующее:

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;
}