Java SpringMVC控制器使用URL参数而不是响应重定向
我试图在我的SpringMVC应用程序中实现RESTfulURL。除了处理表格提交外,一切都很好。我需要重定向到原始表单或“成功”页面Java SpringMVC控制器使用URL参数而不是响应重定向,java,redirect,spring-mvc,controller,Java,Redirect,Spring Mvc,Controller,我试图在我的SpringMVC应用程序中实现RESTfulURL。除了处理表格提交外,一切都很好。我需要重定向到原始表单或“成功”页面 然而,正如我在中读到的,如果重定向,任何参数都将被放入url中。这对我不起作用。解决这个问题的最优雅的方法是什么?您可以让processForm()返回一个视图对象,并让它返回具体类型RedirectView,该类型有一个参数用于setExposeModelAttributes() 当您返回一个以“redirect:”“为前缀的视图名称时,Spring MVC会
然而,正如我在中读到的,如果重定向,任何参数都将被放入url中。这对我不起作用。解决这个问题的最优雅的方法是什么?您可以让
processForm()
返回一个视图对象,并让它返回具体类型RedirectView
,该类型有一个参数用于setExposeModelAttributes()
当您返回一个以
“redirect:”
“为前缀的视图名称时,Spring MVC会将其转换为RedirectView
对象,它只是将设置为true(我认为默认值是一个奇怪的值)。如果您不希望URL中出现成功消息,然后一个选项是将其放入会话(在processForm方法中),然后在setupForm方法中检查(并删除)
编辑为添加:如果手动执行此操作很困难,那么您可以编写RedirectView的子类,添加“message”属性并将其插入会话的过程包装起来。不确定,但是,如果有一种简单的方法可以将消息从会话中恢复过来
老实说,我不认为有一个简单的答案——HTTP重定向的本质是状态不会被转移;不管怎样,如果您想维护状态,您就必须使用各种常见的方式来维护web应用程序中的状态:会话、cookie、查询字符串……为我提供了在Spring MVC提供该功能之前(可能在3.0.2版本中)所需的一切。虽然我只是实现了它们临时创建的类,并将过滤器添加到我的web应用程序上下文中。很好 我也有同样的问题。这样解决:
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;
}
然后我的控制器方法如下所示:
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;
}
除非您希望发送简单的数据,而不是集合(比如说)。然后,我想您必须使用session。这个问题是由模型属性被持久化到查询字符串中引起的(正如其他人所说的),这通常是不可取的,并且有可能造成安全漏洞和荒谬的查询字符串。我通常的解决方案是在SpringMVC中从不使用字符串进行重定向,而是使用可以配置为不公开模型属性的RedirectView(请参阅:)
因此,我倾向于使用一个util方法来执行“安全重定向”,如:
public static RedirectView safeRedirect(String url) {
RedirectView rv = new RedirectView(url);
rv.setExposeModelAttributes(false);
return rv;
}
另一个选项是使用bean配置XML:
<bean id="myBean" class="org.springframework.web.servlet.view.RedirectView">
<property name="exposeModelAttributes" value="false" />
<property name="url" value="/myRedirect"/>
</bean>
同样,您可以将其抽象到自己的类中以避免重复(例如SafeRedirectView)
关于“清除模型”的注意事项-这与所有情况下的“不公开模型”不同。我工作过的一个站点有很多过滤器,可以向模型中添加内容,这意味着在重定向之前清除模型不会阻止长查询字符串。我还建议,“不公开模型属性”是一种比“重定向前清除模型”更具语义的方法。嘿,您可以只做一件简单的事情,而不是使用模型发送参数。使用HttpServletRequest对象并执行此操作
HttpServletRequest request;
request.setAttribute("param", "value")
现在,您的参数将不会显示在url标题中,希望它能正常工作:)您要实现的重定向url是什么?这并不重要,我只需要在处理完post数据后重定向到页面,并通知用户他们提交的内容已成功处理。这似乎是一个普遍的要求。但可能暂时无法修复。实际上,两个相关通知单中描述的修复看起来都无法解决您的特定问题:其中一个是关于控制哪些模型属性作为querystring公开(但仍将公开一些),另一个是关于添加属性作为url路径的一部分(比如说,对于ID来说,这是一个很好的restful,但仍然不能给您提供一个承载成功消息的位置)。如果成功消息未作为查询字符串公开,它如何到达重定向视图?您希望它如何到达成功页面?如果要执行重定向,则您可能需要将其作为请求参数传递,或者您可以在会话中设置它,并在下一页将其删除。但它必须传递给其他人是的,我可以返回带有“/表单”的ModelAndView作为construct参数。但是,这会导致页面成为POST请求。因此,如果他们刷新页面,它会重新发送POST请求。这与我希望发生的不完全一样。因此重定向。但重定向似乎还不支持此操作。它在3.1中设置为修改。当然可能,但由于我的ap应用程序比单一的应用程序要大得多,对每一个表单都要这样做会让人非常痛苦。Struts似乎提供了一种叫做ActionMessages的东西。我不完全确定它是什么。另外,Ruby On Rails提供了一个flash[:通知]。这基本上就是我试图实现的。闪存消息将存储到下一个操作(导致重定向或您所做的其他操作)之前。它似乎试图解决这个问题。他的方法似乎很有趣。嗯,在我看来,他的方法基本上是按照我的想法包装会话并将消息放入会话中。但他给出了实际的代码,因此肯定更有用。作为一个更新,此功能计划在Spring 3.1中使用,而且确实是implemented于Spring 3.1。链接已断开。重定向视图-安全重定向对我有效。谢谢MatCarey!
@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");
}