2013-05-26 25 views
0

,我有以下問題,基於註解的Spring MVC:不能存儲在會話參數(Spring MVC的)

我有兩個控制器(LoginController中,AdminController),我可以傳遞一個對象(類型BonjourUser的與loggedInUser)通過將會話保持在AdminController中來形成LoginController。到現在爲止還挺好。

爲了防止盜鏈,在初始「GET」時,AdminController驗證它在調用時收到有效的管理員用戶。 這是第一次正常工作,因爲loginController會將該對象添加到會話中。

現在問題來了: 一旦管理員登錄並嘗試重新訪問管理頁面(例如,通過JSP中的鏈接),用戶對象似乎已從會話中消失,因爲我得到「loggedInUser」屬性的HttpSessionRequiredException。 AFAIK除非我在會話中調用setComplete(),否則不應該從會話中刪除該對象。 (我沒有調用這個方法!)那麼爲什麼從會話中刪除屬性呢?我讀here,你不能在控制器之間傳遞會話屬性。但據說here這是可能的。我也認爲它應該可以工作,因爲我已經在控制器之間傳遞了一個參數,當我從LoginController重定向到AdminController時。

所以這裏是代碼:

的LoginController:

@Controller 
@SessionAttributes("loggedInUser") 
public class LoginController extends BonjourController 
{ 
    [...] 

    @RequestMapping(value = {"/home"}, method = RequestMethod.POST) 
    public String validate(@ModelAttribute(value = "command") BonjourUser user, ModelMap map, HttpSession session) 
    { 
     [...] 
     map.addAttribute("loggedInUser", loggedInUser); 

     [...] 
     return "redirect:/admin"; 
    } 
} 

而且AdminController:

@Controller 
@RequestMapping(value = "/admin") 
@SessionAttributes("loggedInUser") 
public class AdminController extends BonjourController 
{ 
    @RequestMapping(method = RequestMethod.GET) 
    public String loginAdmin(@ModelAttribute("loggedInUser") BonjourUser loggedInUser, ModelMap map, HttpSession session) 
    { 
     //check if access is authorized 
     if(loggedInUser == null) 
     { 
      return "redirect:/login"; 
     } 

     [...] 
    } 
} 

我在使用環節的管理員JSP(這會導致除外)看起來像這樣

<a href="admin">Once more to admin section</a> 

Basicaly我得到相同的異常時,我只是在我的瀏覽器地址欄輸入:

http://localhost:8080/Bonjour/admin 

唯一的例外是這樣的:

org.springframework.web.HttpSessionRequiredException: Expected session attribute 'loggedInUser' 

所以我需要做什麼改變,以保證用戶對象(loggedInUser)不會從會話中刪除?

由於提前,

Maex

回答

0

我的壞 - 我阻止了餅乾!

因此,除了POST請求,會話沒有機會被保留,因此登錄工作但同一頁面的GET沒有...

0

我試過3個不同版本的春天現在: 3.1.1 3.2.2 3.2.3

總是同樣的問題。調試器告訴我:

我從登錄傳遞給管理員: 對象完全存儲在會話 - >屬性映射中。

我用一個鏈接或重新鍵入URL再次訪問同一頁面: 沒有對象在會話中的任何更多 - >屬性地圖。