39

我正在尝试重定向而不将参数添加到我的 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 风格,并且在重定向后我从不需要参数,因此我不希望将它们添加到重定向中。

任何想法如何摆脱它们?

4

6 回答 6

33

在 Spring 3.1 中,控制此行为的首选方法是RedirectAttributes向您的方法添加参数:

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

它默认禁用添加属性,并允许您控制要显式添加的属性。

在以前的 Spring 版本中,它更复杂。

于 2012-11-06T08:41:41.740 回答
31

在 Spring 3.1 中,使用选项ignoreDefaultModelOnRedirect禁用自动将模型属性添加到重定向:

<mvc:annotation-driven ignoreDefaultModelOnRedirect="true" />
于 2013-05-30T16:44:14.997 回答
13

添加RedirectAttributes参数对我不起作用(可能是因为我的 HandlerInterceptorAdapter 向模型添加了一些东西),但是这种方法可以(感谢@reallynic 的评论):

@RequestMapping("save/")
public View doSave(...)
{
    ...
    RedirectView redirect = new RedirectView("/success/");
    redirect.setExposeModelAttributes(false);
    return redirect;
}
于 2015-09-04T20:27:46.810 回答
9

在 Spring 4 中有一种方法可以通过 java config 使用注解来做到这一点。我正在分享它,以防有人需要它,因为我需要它。

在扩展的配置类上WebMvcConfigurerAdapter,您需要添加:

@Autowired
private RequestMappingHandlerAdapter requestMappingHandlerAdapter;


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

有了这个,你不需要使用RedirectAttributes,它在 java config 中等同于Matroskin的答案。

于 2016-10-27T14:42:10.463 回答
6

如果您使用的是 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

于 2012-11-06T08:43:57.993 回答
2

尝试这个:

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;
}
于 2017-02-03T12:58:54.597 回答