5

有沒有什麼辦法可以檢查我的頁面是否在IE的另一個標籤頁或窗口中未打開?假設我有Page1和用戶點擊「新窗口」,這將打開一個打開相同頁面的新窗口。所以現在有兩個頁面的實例。我想限制瀏覽器在任何給定時間只打開一個頁面實例。如何檢測在IE的另一個窗口中是否已打開同一頁面

其中一個要求是用戶必須能夠刷新頁面,並且仍然處於應用程序內部的相同狀態。所以一次性令牌不適合。

不確定是否有任何方法來區分頁面刷新和打開的新窗口,這就是爲什麼我問。

P.S.這不是一個正常的網站,我明白這樣做通常會是侵入性和邪惡的。這裏有一個很好的例子,因爲它是一個龐大的Web應用程序。

+1

...其他瀏覽器呢? – 2010-04-14 23:48:41

+2

「我想限制瀏覽器在任何給定的時間只打開一個頁面實例」這個比較尷尬和非直觀的行爲意味着要解決什麼問題?當然有更好的方法? – spender 2010-04-14 23:54:19

+1

我同意spender,這似乎非常干擾。實際上,有很多人不明白標籤瀏覽的好壞,甚至不知道他們是否已經在同一頁面上打開另一個頁面:他們將要做什麼? – 2010-04-14 23:57:06

回答

4

實現此目的的最佳方法是通過讓服務器端令牌(許多銀行執行此操作)在每個請求時重新生成並且必須傳回以使頁面正常工作。

所以基本上:

  1. 您可以附加一個生成的令牌給每個 鏈接(作爲查詢字符串的一部分)
  2. 您收到不包含令牌可以被認爲是無效的請求。
  3. 在每一位申請新的令牌,以便只有1令牌是有效的,在任何1次
+6

我剛刷新頁面。哎呀。 – spender 2010-04-14 23:55:18

+0

也必須處理頁面刷新,所以不能接受。 – 2010-04-15 00:04:18

+0

如果您在document.load上生成一個標記,這實際上是有意義的。我們不斷髮送請求,因此我們只能檢測到來自同一用戶的請求,但有2個不同的令牌,並且將重定向回覆給其中的一個。 – 2010-04-15 00:24:52

0

我能想到的唯一方法是爲每個頁面創建一個標識該頁面及其訪問時間的cookie,並且過期時間僅爲幾秒或幾分鐘(根據口味調整),並且負載爲您的網站(或頁面加載)檢查該cookie是否存在。

僞代碼:

if (cookie exists) { 

Page already loaded in another tab/window. 

} 

else { 

write cookie 

} 

Possiby你可以使用某種形式的會話ID的基礎上,一些非唯一。也許用戶的IP地址,用戶名和鹽?單獨使用IP地址的缺點是所有用戶都在同一個地址的路由器後面,將用戶名和用戶名聯繫起來的好處是每個用戶至少都是唯一的,鹽用於基本安全(可能並不是所有的對你來說很重要,但它似乎仍然是一種好習慣),並且防止用戶被鎖定,因爲他們在某處「打開了另一個窗口」。

如上所述,檢查會話ID是否存在,如果不存在,則創建它。

正如@Spender所指出的,在對您的問題和其他答案的評論中,任何實現此功能的解決方案都至少存在一個問題,即人們不能刷新頁面。短小的cookie時間至少可以緩解,但不會阻止用戶被激怒。


編輯:

要處理,需要進行頁面刷新,我想你可以使用onUnload(或jQuery的.unload)摧毀cookie的,所以,它的用戶留下刪除/刷新頁面。

運行onUnload的js可以用來刪除會話變量,也可以通過Ajax或客戶端上的cookie刪除會話變量。

相關問題