2013-07-19 20 views
1

我有一個應用程序,我打算在我的數據庫中設置一個鎖定標誌,如果設置,它將排除其他人查看同一頁面。觸發瀏覽器離開當前頁面的數據庫調用?

但是,一旦設置 - 我不知道如何「解除」它。我可以讓用戶取消設置該標誌,但似乎沒有必要。

我想只是尋找瀏覽器離開頁面,打電話到數據庫,並解鎖頁面。

怎樣才能做到這一點的東西「類型」(不找的確切方式)與JSF /使用Javascript/jQuery的(所有選項)

+0

這是因爲你不希望人們相互覆蓋?更可靠的解決方案可能是在數據庫中有一個「上次更新」字段,並將其傳遞給客戶端。當用戶保存時,如果「上次更新」比檢索數據時更新,則通知用戶其他人已進行了更改。也許你可以選擇覆蓋。 –

回答

2

真的沒有一個可靠的方法來做到這一點,無論如何我已經看到了。

您可以使用瀏覽器的onbeforeunload事件來告訴服務器,「嗨,我現在離開頁面」。問題是你實際上不能從頁面卸載。如果用戶實際上正在關閉瀏覽器,則任何打開的套接字將立即關閉。您的Web服務器可能會或可能不及時獲得請求。採用這種方法,我的結果非常糟糕。

可能工作的一種方法是採用某種超時機制。該頁面每隔30秒就會ping服務器,或者不在,說「我還在這裏」。如果服務器在幾分鐘後沒有得到此更新,它將使會話無效並釋放該文檔。也許這可以通過檢查最近的ping是否有新來的人來進行優化。與此相關的一個問題是,如果有人離開了該頁面,則下一個用戶可能必須等待一兩分鐘才能進入該頁面。然後,您必須找到一個ping流量頻率,不會讓流量佔用您的服務器,但也不會讓下一個用戶等待太久。

也可以結合這兩種方法。當用戶離開頁面時,捕獲onbeforeunload事件並立即使會話失效。但是,如果它不起作用,那麼會話將在一分鐘之後超時。

有更好的解決方案嗎?

如果你真的需要在web應用程序,以便多個用戶無法編輯文檔時,您可能需要調查的整體設計。你害怕用戶破壞數據嗎?如果是這樣,也許可以採用一種機制來解決合併衝突,或者檢測兩組變更是否可以合併。

如果您想要真正使用Web 2.0,您可以設計類似於Google文檔的內容,在這些內容中,所做的更改都會在現場生效。不需要任何地方的保存按鈕!

+0

超時解決方案是我們要去的路線。感謝你的回答 – user2124871

0

發送「保活信號」可能是一個選項。在前端的這些行上加上會話cookie。

setInterval(function() { 
    var img = new Image(); 
    var src = "http://examle.com/keepalive.gif?cachebuster=" + 
     Math.ceil(Math.random() * 10000); 
}, 1000); 
相關問題