2010-10-15 62 views
1

是否可以阻止用戶在多個瀏覽器選項卡或窗口中打開JSF頁面?防止用戶在瀏覽器中的多個選項卡/窗口中打開JSF頁面

+0

請詳細說明有關爲您所想,這是SOLU問題而不是問如何實現一個解決方案,畢竟這本身可能不是正確的解決方案。 – BalusC 2010-10-15 12:08:11

+0

@BalusC該問題涉及完全有狀態的舊JSF應用程序。爲什麼試圖找出某種方式告知用戶在兩個單獨的選項卡中打開應用程序有潛在危險。我們絕不能將會話託管的bean更改爲請求託管的bean。 – mgamer 2010-10-15 12:20:42

回答

2

@BalusC該問題涉及完全有狀態的舊JSF應用程序。爲什麼試圖找出某種方式告知用戶在兩個單獨的選項卡中打開應用程序有潛在危險。我們絕不能將會話託管的bean更改爲請求託管的bean。

使所有這些bean請求範圍,安裝Tomahawk,加<t:saveState value="#{bean}" />爲每個bean的每一個,其中要準確保留在後續請求同一個bean的狀態視圖。這可以在標籤/窗口中獨立工作。

如果沒有戰斧,替代方案將爲您希望在後續請求中保留的每個bean屬性添加<h:inputHidden />。但是,我可以想象,如果有很多或者它們不是標準EL類型(因此您可以創建一個Converter),這可能會產生令人討厭的樣板代碼。但那是你得到的報酬。

+0

或使用SEAM。 =)http://seamframework.org/ – bungrudi 2010-10-15 12:31:41

+0

我不會將Seam集成到現有的JSF應用程序中。 – BalusC 2010-10-15 12:33:08

+0

這是一條非常有用的建議,但我們已決定創建簡單的基於cookie的檢查,如果頁面僅在一個頁面中打開,並且在第二個選項卡已打開的情況下顯示適當的警告。 – mgamer 2010-10-15 13:50:16

0

我想到的一種情況是: 將一個JavaScript組件放在頁面中,該組件會通過AJAX不斷髮送心跳信號到服務器。只要瀏覽器發送心跳,該頁面將被標記爲「正在查看」。只要頁面上有該標誌,就應該拒絕對該頁面的其他請求。

細節可能比這個簡單的故事要複雜得多(例如,你可能需要某種'頁面ID'與心跳一起發送),但你明白了(......我希望:) 。

只要您願意付出代價,一切皆有可能。

1

我同意接受的解決方案,但如果你還是要做到這一點,這些步驟爲我工作(僞代碼/僞蟒蛇):

在JS方面:

if tabId not set: 
    . generate random number 
    . set property in sessionStorage 
otherwise: 
    . get it from sessionStorage 
make an ajax callback and send tabId 
onError: 
    . alert(); 
    . close current tab (if possible); 
    . logout 

後端:(JSF)

Create custom filter: 
    if request contains the tabId info: 
    if it matches session's tabId: (being tabId not null) 
     sent response status code to an error such as forbidden 
     Optionally invalidate session 
    otherwise apply session filtering (do nothing) 
相關問題