当前位置:  开发笔记 > 编程语言 > 正文

Spring MVC Controller使用URL参数重定向而不是响应

如何解决《SpringMVCController使用URL参数重定向而不是响应》经验,为你挑选了4个好方法。

我试图在我的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中.这对我不起作用.围绕这个最优雅的方式是什么?



1> Mat..:

我有同样的问题.这样解决了:

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;
}

除非你想发送简单的数据,否则完全可以工作,而不是收集.然后你必须使用会话我猜.



2> MatCarey..:

这个问题是由于模型属性被持久化到查询字符串中引起的(正如其他人所说) - 这通常是不可取的,并且存在创建安全漏洞以及荒谬的查询字符串的风险.我通常的解决办法是从来不使用字符串在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).


关于"清除模型"的说明 - 这与在所有情况下"不暴露模型"不同.我工作的一个站点有很多过滤器,它们向模型添加了东西,这意味着在重定向之前清除模型不会阻止长查询字符串.我还建议"不暴露模型属性"是一种比"在重定向之前清除模型"更具语义性的方法.



3> matt b..:

您可以processForm()改为返回一个View对象,并让它返回RedirectView具有参数的具体类型setExposeModelAttributes().

当你返回一个带有前缀的视图名称时"redirect:",Spring MVC RedirectView无论如何都将它转换为一个对象,它只是将其设置setExposeModelAttributes为true(我认为这是一个奇数值默认值).



4> 小智..:

http://jira.springframework.org/browse/SPR-6464为我提供了我需要的东西,直到Spring MVC提供功能(可能在3.0.2版本中).虽然我只是简单地实现了他们暂时的类,并将过滤器添加到我的Web应用程序上下文中.效果很好!


它确实在Spring 3.1中实现.
推荐阅读
yzh148448
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有