2017-02-14 61 views
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)); 

恕我直言的處理程序不應該擔心它是怎麼被調用(重定向,直接),所以不應該重新添加閃光屬性。

回答

0

您可以使用@SessionAttributes在控制器級別

here for more details

+0

會話屬性不適合這裏,因爲我們只希望它活鏈接請求的用戶,我們不想'errorMessage'堅持跨請求。除非被重定向,否則我們也希望這會在用戶請求中丟失。 Flash屬性起作用,我只需要它們爲多個重定向工作。 –