2017-01-20 59 views
0

Web應用程序我多頁的應用程序,我需要檢查,如果用戶正在alredy打開其他瀏覽器選項卡或在其他瀏覽器窗口(IE8)的應用程序,並避免這種情況(在打開註銷用戶新窗口/標籤)避免用戶打開多個標籤或窗口

我使用JSP,JavaScript和jQuery的

如果其真正的 - 不使用的sessionStorage

EDITED 我也使用iframe的和IE8模式對話框。

回答

0

你需要使用像SignalR技術,保持連接打開。然後,您需要ping連接以查看該用戶是否已連接並關閉其現有連接。如果這個實現過於令人生畏,那麼可以爲調用登錄表的應用程序/頁面(或任何這些事件的存儲設備)添加一個計時器循環,並且如果有新登錄,則調用它自己的註銷過程。

0

一個辦法是維持一個地圖(在內存中或基於用戶數DB)中存儲username vs session-id您的應用範圍。在每次登錄時,如果已經存在該usernamesession,則在此映射中查找。如果存在,則使現有會話無效,否則將新的session-id存儲在地圖中。 [未測試]

0

可以傳遞在用戶會話ID或隨機生成的ID到全局/窗口變量,即;

window.state = 'SomeLoginIdString'; 

將客戶端頁面可以輕鬆訪問的其他變量(最好是客戶端上的數據存儲)保留在其他變量中。

var loginAccessCurrentState = 'SomeLoginIdString'; 

當使用打開/切換頁面比較兩者,如果它爲false,您可以重定向到404頁面。

loginAccessCurrentState === window.state 

的想法是你唯一的登錄會話期間通過國家,如果用戶打開一個新的標籤,狀態默認情況下未定義。

+0

如果我用即模態對話框的I幀(同一產地)將它的工作? Window變量在它們中是未定義的,但window.parent.state可能不是...... –

0

對於單頁應用以下方法可以是一個簡單的解決方案:

  1. 創建條目頁面上隨機ID,它存儲在會話,並在GUI
  2. 在每個AJAX調用添加隨機ID作爲附加HTTP頭的請求
  3. 如果ID在給定頭和會話之間不匹配,則應用程序在另一個選項卡/窗口中打開,並且此調用來自「舊」選項卡
  4. 產生的答案的服務器必須引導GUI進入CK /關閉自己在受影響的選項卡