簡體   English   中英

Spring MVC Controller使用URL參數重定向而不是響應

[英]Spring MVC Controller redirect using URL parameters instead of in response

我試圖在我的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:

<bean id="myBean" class="org.springframework.web.servlet.view.RedirectView">
   <property name="exposeModelAttributes" value="false" />
   <property name="url" value="/myRedirect"/>
</bean>

同樣,您可以將其抽象到自己的類中以避免重復(例如SafeRedirectView)。


關於“清除模型”的說明 - 這與在所有情況下“不暴露模型”不同。 我工作的一個站點有很多過濾器,它們向模型添加了東西,這意味着在重定向之前清除模型不會阻止長查詢字符串。 我還建議“不暴露模型屬性”是一種比“在重定向之前清除模型”更具語義性的方法。

您可以讓processForm()返回一個View對象,並讓它返回具有setExposeModelAttributes()參數的具體類型RedirectView

當你返回一個前綴為"redirect:"的視圖名稱時,Spring MVC無論如何都會將它轉換為RedirectView對象,它只是將setExposeModelAttributes為true(我認為這是一個奇數值默認值)。

http://jira.springframework.org/browse/SPR-6464為我提供了我需要的東西,直到Spring MVC提供功能(可能在3.0.2版本中)。 雖然我只是簡單地實現了他們暫時的類,並將過濾器添加到我的Web應用程序上下文中。 效果很好!

如果您不希望URL中有成功消息,那么一個選項是將它放在會話中(在processForm方法中)​​,然后在setupForm方法中檢查它(並將其刪除)。

編輯添加:如果這是一個手動操作的痛苦,那么你可以寫一個RedirectView的子類,它添加一個“消息”屬性並包裝插入會話的過程。 但是,不確定是否有一種簡單的方法可以將消息從會話中取出...

老實說,我認為沒有一個簡單的答案 - HTTP重定向的本質是狀態不會被延續; 如果你想保持狀態,你仍然堅持使用各種常用方法來維護Web應用程序中的狀態:會話,cookie,查詢字符串......

嘿,你可以做一個簡單的事情而不是使用模型發送參數使用HttpServletRequest對象並執行此操作

HttpServletRequest request;
request.setAttribute("param", "value")

現在您的參數將不會顯示在您的網址標題中希望它能正常工作:)

@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");
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM