[英]Spring MVC Controller: Redirect without parameters being added to my 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.