2013-05-28 13 views
3

我有struts2的這個應用程序流程:如何在struts2中實現與用戶登錄綁定的會話?

  1. Page_A.jsp包含形式可以提交一個數據到ActionA類方法執行A

  2. ActionA->與密鑰的使sesion執行A方法存儲數據「的myKey」

  3. ActionA返回結果給Page_B.jsp

  4. Page_B.jsp包含形式,可以提交數據ActionA類方法E xecuteB

  5. 在ActionA->執行B方法,它會從「的myKey」會議

我發現有兩種方法可以從會話設置和獲取數據獲取提交的數據:

  1. 使用ActionContext中

    // put the data into session 
    Map session = ActionContext.getContext().getSession(); 
    session.put("myKey", data); 
    
    // get the data from session 
    Map session = ActionContext.getContext().getSession(); 
    data = (String[]) session.get("myKey"); 
    
  2. 使用ServletActionContext

    // put the data into session 
    HttpServletRequest request = ServletActionContext.getRequest(); 
    HttpSession session = request.getSession(false); 
    session.setAttribute("myKey", data); 
    
    // get the data from session 
    HttpServletRequest request = ServletActionContext.getRequest(); 
    HttpSession session = request.getSession(false); 
    data = (String[]) session.getAttribute("myKey"); 
    

兩種方式之間,哪一個是更好的辦法?或者有更好的方法嗎? (我更喜歡簡單的方式,如果有的話)

第二件事,我想確保會話與用戶登錄會話綁定。這意味着一個用戶的「myKey」會話數據將與另一個用戶的「myKey」會話數據不同(「myKey」會話數據永遠不會被來自另一個用戶的「myKey」會話數據覆蓋)。

例如:

  1. 用戶1登錄

  2. 用戶1進入Page_A.jsp並提交數據,現在他在Page_B.jsp(現在的「的myKey」會話包含提交用戶1數據)

  3. 用戶2登錄

  4. 用戶2去Page_A.jsp太提交數據

  5. 我很擔心,如果用戶1從Page_B.jsp提交,「myKey」中的數據是否仍會引用他提交的原始數據,或者他將從User2中獲取數據(因爲「myKey」會話數據是替換)?

回答

2

使用ActionContext.getContext().getSession();如果你是在一個攔截器工作,因爲它不具備DI的行動,對另一方面的動作加上SessionAware接口和會話將被注入。

注入法降低了耦合度,使測試操作變得更加容易。

上述兩種假設你不需要完整的HttpServletRequest接口(這已經遠遠超過功能只是的參數圖):http://docs.oracle.com/javaee/6/api/javax/servlet/http/HttpServletRequest.html

如果你需要這個接口,那麼ServletActionContext.getRequest();當然是正確的。再次在動作中,您可以使用ServletRequestAware來降低耦合,這會爲您注入HttpServletRequest

如果您只需要一張房產地圖,那麼只需使用爲您提供地圖的方法即可。這又是因爲它測試起來容易很多,意圖很明確。

會話是唯一的,它們由應用程序服務器維護。爲了簡單起見,當用戶使用您的應用程序時,您可以放心,有一個會話。

+0

可以在Action類中使用'ActionContext.getContext()。getSession()'嗎?你是說這個會議不是全球性的,對嗎? – null

+0

會話是每個用戶,範圍爲用戶(全局是一個令人困惑的術語,不適用於Java)。沒有什麼能阻止你,它會工作,但是當你有SessionAware和ServletRequestAware接口時,你應該嘗試使用它們。 – Quaternion