我试图在我的Spring MVC应用程序中实现RESTful URL.一切都很好,除了处理表格提交.我需要将其重定向回原始表单或"成功"页面.
@Controller @RequestMapping("/form") public class MyController { @RequestMapping(method = RequestMethod.GET) public String setupForm() { // do my stuff return "myform"; } @RequestMapping(method = RequestMethod.POST) public String processForm(ModelMap model) { // process form data model.addAttribute("notification", "Successfully did it!"); return "redirect:/form"; } }
但是,正如我在Spring文档中读到的那样,如果重定向任何参数都会被放入url中.这对我不起作用.围绕这个最优雅的方式是什么?
我有同样的问题.这样解决了:
return new ModelAndView("redirect:/user/list?success=true");
然后我的控制器方法看起来像这样:
public ModelMap list(@RequestParam(required=false) boolean success) { ModelMap mm = new ModelMap(); mm.put(SEARCH_MODEL_KEY, campaignService.listAllCampaigns()); if(success) mm.put("successMessageKey", "campaign.form.msg.success"); return mm; }
除非你想发送简单的数据,否则完全可以工作,而不是收集.然后你必须使用会话我猜.
这个问题是由于模型属性被持久化到查询字符串中引起的(正如其他人所说) - 这通常是不可取的,并且存在创建安全漏洞以及荒谬的查询字符串的风险.我通常的解决办法是从来不使用字符串在Spring MVC重定向,而是使用它可以配置为不暴露模型属性的RedirectView的(参见:http://static.springsource.org/spring/docs/3.1.x/javadoc- api/org/springframework/web/servlet/view/RedirectView.html)
RedirectView(String url, boolean contextRelative, boolean http10Compatible, boolean exposeModelAttributes)
所以我倾向于使用一个util方法来执行'安全重定向',如:
public static RedirectView safeRedirect(String url) { RedirectView rv = new RedirectView(url); rv.setExposeModelAttributes(false); return rv; }
另一个选择是使用bean配置XML:
同样,您可以将其抽象到自己的类中以避免重复(例如SafeRedirectView).
关于"清除模型"的说明 - 这与在所有情况下"不暴露模型"不同.我工作的一个站点有很多过滤器,它们向模型添加了东西,这意味着在重定向之前清除模型不会阻止长查询字符串.我还建议"不暴露模型属性"是一种比"在重定向之前清除模型"更具语义性的方法.
您可以processForm()
改为返回一个View对象,并让它返回RedirectView
具有参数的具体类型setExposeModelAttributes()
.
当你返回一个带有前缀的视图名称时"redirect:"
,Spring MVC RedirectView
无论如何都将它转换为一个对象,它只是将其设置setExposeModelAttributes
为true(我认为这是一个奇数值默认值).
http://jira.springframework.org/browse/SPR-6464为我提供了我需要的东西,直到Spring MVC提供功能(可能在3.0.2版本中).虽然我只是简单地实现了他们暂时的类,并将过滤器添加到我的Web应用程序上下文中.效果很好!