2010-01-29 80 views
6

我的Web應用程序的用戶可能有多個瀏覽器窗口(或選項卡)打開並指向相同的頁面。我們使用的是基於Cookie的會話ID,用戶通常會在兩個瀏覽器/選項卡中的同一會話ID內工作。我希望能夠唯一地標識哪個瀏覽器窗口(和標籤)要求ASP.NET頁面(爲了確保存儲在會話中的數據不會混淆)。在ASP.NET(服務器端)中,如何唯一標識一個瀏覽器窗口與另一個瀏覽器窗口在同一cookiedbased sessionId

(例如,我會很高興,如果瀏覽器將生成併發送窗口/標籤-ID與HTTP請求,因爲它發佈HTTP_USER_AGENT)

任何想法?

- 托馬斯

回答

2

如果我要實現這樣的事情,我可能會從Dictionary<Type, List<Guid>>開始,並將其存儲在用戶會話中。我也很可能使這是一個自定義的類型代表了字典和有工作原理類似

public Guid GeneratePageIdentifier(Page thepage) 
{ 
    var guid = Guid.New(); 

    if(_dictionary[thepage.GetType()] == null) 
     _dictionary[thepage.GetType()] = new List<Guid> { guid }; 
    else 
     ((List<Guid>)_dictionary[thepage.GetType()]).Add(guid); 

    return guid; 

} 

然後嵌入這是一個從頁面的ViewState的那個方法返回的GUID的工廠方法。在你的頁面上,執行你需要驗證哪個頁面的動作的方法能夠驗證guid是否在集合內部執行某些操作。你可能也想實現一個帶有guid屬性的自定義類型來保護更多關於你爲什麼這麼做的信息,或者你需要什麼來使其變得有意義。

2

每個頁面上的視圖狀態會有所不同,也許你可以使用某種類型的每一頁上創建的唯一標識符的裝?

+1

然後,您可以使用此標識來存儲下的活動會話的實際數據。這樣,您就不會在那裏獲得任何(可能)敏感的數據,並且您的ViewState不會變得太大。 – Thorarin 2010-01-29 13:33:31

1

由於網絡的無狀態性,但是默認不可能,您可以添加一個「頁面標識符」,該頁面標識符在每個打開的頁面中生成並針對每個操作傳輸。

我建議你以一種混淆不會發生的方式重構應用程序,不管從請求來自哪個頁面/標籤頁/窗口。

1

正如Mark Redman所說,您可以使用Viewstate + Session來存儲特定於頁面的值。 ViewState適用於存儲密鑰(字符串),Session用於存儲任何類型的複雜對象。

使用ViewState或隱藏字段爲了在第一次調用GUID時加載。

public string PageUid 
    { 
     get 
     { 
      if (ViewState["UID"] == null) 
       ViewState.Add("UID", Guid.NewGuid().ToString()); 

      return ViewState["UID"].ToString(); 
     } 
    } 

然後使用會話獲取/使用此鍵設置你的價值觀:

string MyPagesessionVariable 
    { 
     get 
     { 
      if (Session["MYVAR" + PageUid] == null) 
      { 
       Session["MYVAR" + PageUid] = "VALUE NOT SHARED WITH OTHER TABS/WINDOWS"; 
      } 

      return Session["MYVAR" + PageUid]; 
     } 

     set 
     { 
      Session["MYVAR" + PageUid] = value; 
     } 
    } 
相關問題