2009-11-03 75 views
1

我們的許多內部和外部用戶啓動我們的Web應用程序。然後在稍後的一段時間,他們從瀏覽器中打開一個新窗口。他們想要運行2個獨立的應用程序會話。但是,通過這樣做,他們實際上使用相同的會話數據。如何判斷2個瀏覽器窗口是否共享會話?

有沒有一種方法,在代碼中,以確定是否有另一個瀏覽器窗口打開相同的會話?

我們使用VS 2008,C#和/或VB.Net。

謝謝。

COMBINING我的回覆從下面:

也許我說這是錯誤的。當他們打開第二個窗口並將其更改爲其他窗口小部件編號,然後返回到原始窗口時,在下一個回發窗口中將使用第二個窗口的窗口小部件編號,而不是其自己的窗口小部件編號

我們正在使用IE7。

回答

1

我測試過的應用程序(IE,FF和Google Chrome)上的主要瀏覽器都默認使用相同的Cookie集合,無論您是在新標籤頁還是新的瀏覽器實例中打開重複的網頁。

結果是,默認情況下,2個不同的選項卡或同一瀏覽器的2個實例看起來與服務器的會話相同。

由於多個實例使用相同的cookie,因此服務器無法區分來自它們的請求,並且會將它們與相同的Session數據相關聯,因爲它們都具有相同的SessionID(假設基於Cookie的SessionID)。

通常情況下,這種行爲沒有任何問題,並且您需要針對該行爲設置一個良好的商業案例以編碼工作。

我不相信有可能從服務器端代碼區分不同的瀏覽器選項卡。可能會有某種客戶端腳本破解,這將有所幫助。

是否有助於包含一個Html元刷新標記,以便各個標籤至少定期更新自己?另一方面,如果您將一組用戶/服務器交互視爲一種「會話內會話」,您可能可以通過存儲一個隨機Guid(或小部件編號)在ViewState,並檢查它回發。

希望這會有所幫助。

+0

謝謝!我想要做的是應用程序啓動時檢查是否有另一個窗口使用同一個cookie/session,如果是,請關閉並在新的cookie/session中打開該應用程序。我知道如何在新會話中打開應用程序,但不知道如何檢查它是否共享cookie /會話? – Jim 2009-11-04 14:13:36

+0

要做到這一點,您需要使用每個GET或POST發送到服務器的每個瀏覽器窗口的唯一標識符。也許你可以在javascript頁面載入事件中生成一個隨機的「窗口ID」(參考http://stackoverflow.com/questions/105034/how-to-create-a-guid-uuid-in-javascript),並將其存儲在URL查詢字符串或一個cookie,所以它在GET和POST都發送到服務器。 然後,服務器端代碼需要通過會話跟蹤窗口ID,並在看到與同一會話關聯的2個不同窗口ID時採取行動。 我只會這樣做,如果你真的需要壽! – saille 2009-11-04 20:01:18

0

他們沒有共享相同的數據。在新的瀏覽器窗口中啓動新會話,並啓動單獨的數據庫訪問。

+0

更正:新會話被創建,所以它=是一組新的會話日期。 – IrishChieftain 2009-11-03 19:56:41

+0

是的,如果用戶使用Firefox,他們將共享相同的會話數據。我相信所有其他瀏覽器都會在新選項卡中實例化新會話。 – jennyfofenny 2009-11-03 20:37:35

+0

這發生在IE7中。 – Jim 2009-11-03 21:44:04

0

您可以檢查Fiddler中的標頭,也可以在Windows中輸出Session.ID。會話是爲每個瀏覽器實例創建的,而不是每個窗口。

+0

也許我是說這個錯。當他們打開第二個窗口並將其更改爲其他窗口小部件編號,然後返回到原始窗口時,在下一個回發窗口中,它將使用第二個窗口的窗口小部件編號,而不是它自己的窗口編號。 – Jim 2009-11-03 20:11:08

2
  • IE8-在選項卡和瀏覽器實例之間共享會話;可以使用文件 - >新建會話命令啓動新會話
  • IE7 - 在選項卡之間共享會話,但不在瀏覽器實例之間共享
  • Firefox - 在選項卡和實例之間共享會話;另一個Firefox可以在不同的配置文件來啓動(firefox.exe -P「PROFILENAME」個遙控),然後有單獨的會話
相關問題