2012-01-08 58 views
5

我有一個GWT應用程序在其後端有RPC服務。我目前正在嘗試實現用戶支持,唯一仍然存在的問題是我應該存儲會話數據的方式。在GWT應用程序中使用會話

我存儲使用

getThreadLocalRequest().getSession().setAttribute("sid", "randomSIDgoeshere"); 

所以,第一個問題是不是更GWT對Java servlet的會話ID。此代碼是否保證下一次我作出這樣一個電話:

getThreadLocalRequest().getSession().getAttribute("sid"); 

它要麼是空(如果它被調用爲尚未訪問過的一段代碼,其中SID屬性設置用戶)或者它與我已經爲該用戶保存的完全相同的SID。換句話說,這兩個代碼是用戶特定的嗎? (通過用戶我的意思是單個計算機上的單個瀏覽器)

第二個問題是關於存儲SIDs和一些額外的數據,如用戶ID之間的映射。如果我有這樣的代碼:

public class MyGwtServiceImpl extends RemoteServiceServlet implements MyGwtService { 
    // SID to User ID mappings 
    private final Map<String, String> sessions = 
    new HashMap<String, String>(); 
    ... 
} 

能夠保證所有的sessions始終是同一個對象的所有請求,除非整個應用程序終止其數據將保持「活着」? (例如Tomcat停止)這是正常的方法還是我應該堅持所有這些映射到我的數據庫?

回答

7

第一張:

是的,它確實。下次您在下一次請求時致電getThreadLocalRequest().getSession().getAttribute("sid");時,屬性sid將停留在那裏。但請記住,這是本地請求區域,因此只有來自同一用戶(瀏覽器+ ip)的請求才會共享這些信息。這意味着:

事實:

  • 用戶A使用Firefox連接
  • 你存儲一個隨機值X與IDŸ

案例1個

  • 用戶A連接與火狐
  • 您可以檢索X

案例2

  • 用戶A使用谷歌瀏覽器連接
  • 您不能檢索值X

案例3

  • 用戶B使用Firefox
  • 連接
  • 你不能retr即值X

所以是的,會話的內容是用戶特定的。一個會話中存在的內容並不意味着會在其他會話中存在。

第二個:

不,不能保證。雖然大部分時間都會調用相同的servelet isntance,但不能保證它始終存在。如果你想在你的servelet中保留屬性,你必須將這些屬性聲明爲Static,那麼THAT靜態屬性將不是用戶特定的。或者你可以存儲在ServeletContext

我這樣說,因爲不同的實現(如Glassfish)可以終止實例,如果servelet不需要很長一段時間(據我記得,我不知道(Glassfish終止實例))。但是沒有文檔說它確實會保證它是同一個實例,所以你不能聲明非靜態屬性並在不同的實例之間共享。

+0

謝謝,真是太棒了! – agibalov 2012-01-08 22:22:18

相關問題