0
假設我有一個查看客戶的控制器方法,如果他們無權查看該客戶,則將錯誤消息添加爲Flash屬性,然後重定向到一個區域上市,但是;如果用戶被分配了一個地區,那麼地域處理方法將重定向到該地區內的客戶列表。如何保留多個重定向上的模型Flash屬性
@RequestMapping("/customers/{id}")
public ModelAndView customers(@PathVariable("id") long id,
Principal principal,
RedirectAttributes ra) {
// if user is not allowed
if (!svc.isAccessGrantedToCustomer(principal.getName(), id)) {
ra.addFlashAttribute("errorMessage",
"Access denied for customer " + id + ".");
return new ModelAndView("redirect:/territories");
}
// get customer and return new view...
}
@RequestMapping("/territories")
public ModelAndView territories(Principal principal,
RedirectAttributes ra) {
// get some territory for user.
Long id = svc.getUserTerritory(principal.getName());
if (id != null) {
return new ModelAndView("redirect:/territories/" + id);
}
// return new view.
}
@RequestMapping("/territories/{id}")
public ModelAndView territory(@PathVariable("id") long id,
Principal principal,
ModelAndView mav,
Model m,
RedirectAttributes ra) {
// mav is empty, it does not contain flash attributes.
// m does contain flash attributes.
// Fill model and return view.
mav.setViewName("territory");
// fill the model...
return mav;
}
所有重定向都按預期工作,但模型屬性丟失。
我發現的是,模型屬性存在於Model
。
然而,一種解決方案是將Model
的所有閃存屬性重新添加到RedirectAttribute
;這似乎是不必要的,實際上比我想要的還要多。
m.asMap().forEach((k, v) -> ra.addFlashAttribute(k, v));
恕我直言的處理程序不應該擔心它是怎麼被調用(重定向,直接),所以不應該重新添加閃光屬性。
會話屬性不適合這裏,因爲我們只希望它活鏈接請求的用戶,我們不想'errorMessage'堅持跨請求。除非被重定向,否則我們也希望這會在用戶請求中丟失。 Flash屬性起作用,我只需要它們爲多個重定向工作。 –