Java SpringMVC控制器使用URL参数而不是响应重定向

Java SpringMVC控制器使用URL参数而不是响应重定向,java,redirect,spring-mvc,controller,Java,Redirect,Spring Mvc,Controller,我试图在我的SpringMVC应用程序中实现RESTfulURL。除了处理表格提交外,一切都很好。我需要重定向到原始表单或“成功”页面 然而,正如我在中读到的,如果重定向,任何参数都将被放入url中。这对我不起作用。解决这个问题的最优雅的方法是什么?您可以让processForm()返回一个视图对象,并让它返回具体类型RedirectView,该类型有一个参数用于setExposeModelAttributes() 当您返回一个以“redirect:”“为前缀的视图名称时,Spring MVC会

我试图在我的SpringMVC应用程序中实现RESTfulURL。除了处理表格提交外,一切都很好。我需要重定向到原始表单或“成功”页面


然而,正如我在中读到的,如果重定向,任何参数都将被放入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");
}