Spring MVC Controller使用URL参数进行redirect,而不是作为响应
我正在尝试在我的Spring MVC应用程序中实现RESTful url。 一切都很好,除了处理表格提交。 我需要重新导向回到原始forms或“成功”页面。
@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的文档中所读到的,如果你redirect的话,任何参数都会被放到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; }
除非你想发送简单的数据,而不是collections。 那么你不得不使用会议我猜。
这个问题是由于模型属性被持久化到查询string中引起的(正如其他人所说的) – 这通常是不受欢迎的,并且有可能造成安全漏洞以及荒谬的查询string。 我通常的解决scheme是在Spring MVC中从不使用stringredirect,而是使用可以configuration为不暴露模型属性的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)
所以我倾向于有一个“安全redirect”的util方法:
public static RedirectView safeRedirect(String url) { RedirectView rv = new RedirectView(url); rv.setExposeModelAttributes(false); return rv; }
另一种select是使用beanconfigurationXML:
<bean id="myBean" class="org.springframework.web.servlet.view.RedirectView"> <property name="exposeModelAttributes" value="false" /> <property name="url" value="/myRedirect"/> </bean>
再一次,你可以抽象成它自己的类,以避免重复(例如SafeRedirectView)。
关于“清除模型”的说明 – 这与在所有情况下“不暴露模型”都是一样的。 我工作的一个站点有很多filter,这些filter将事情添加到模型中,这意味着在redirect之前清除模型不会阻止长查询string。 我还build议“不暴露模型属性”是比“redirect之前清除模型”更为语义的方法。
你可以让processForm()
返回一个View对象,让它返回具有setExposeModelAttributes()
参数的具体typesRedirectView
。
当你返回一个以"redirect:"
为前缀的视图名时,Spring MVC将它转换为一个RedirectView
对象,它只是将setExposeModelAttributes
为true(我认为这是一个奇数值)。
http://jira.springframework.org/browse/SPR-6464为我提供了我需要的东西,直到Spring MVC提供了这个function(可能在3.0.2版本中)。 虽然我只是简单地实现了他们临时的类,并将filter添加到我的Web应用程序上下文中。 太棒了!
如果你不想要URL中的成功消息,那么一个选项是把它放在会话中(在processForm方法中),然后在setupForm方法中检查它(并删除它)。
编辑补充说:如果这是一个手动操作的痛苦,那么你可以编写一个RedirectView的子类,添加一个“message”属性并包装插入会话的过程。 但是,不确定的是,如果有一种简单的方法可以将消息从会话中取出…
老实说,我不认为有一个简单的答案–HTTPredirect的本质是,状态不会结转; 如果你想保持状态,你坚持使用各种常见的方式来维护Web应用程序的状态:会话,cookie,查询string…
嘿,你可以做一个简单的事情,而不是使用模型发送参数使用HttpServletRequest对象,并做到这一点
HttpServletRequest request; request.setAttribute("param", "value")
现在你的参数将不会显示在你的url头希望它的作品:)
@RequestMapping(path="/apps/add", method=RequestMethod.POST) public String addApps(String appUrl, Model model, final RedirectAttributes redirectAttrs) { if (!validate(appUrl)) { redirectAttrs.addFlashAttribute("error", "Validation failed"); } return "redirect:/apps/add" } @RequestMapping(path="/apps/add", method=RequestMethod.GET) public String addAppss(Model model) { String error = model.asMap().get("error"); }