簡體   English   中英

多個瀏覽器窗口打開時如何防止多個ajax請求

[英]How to prevent multiple ajax requests when multiple browser windows are open

我一直在努力在網站上建立一個即時通訊系統(有點像Facebook和Gmail)。 我有javascript輪詢服務器的新消息。

如果用戶有多個網站實例打開,有沒有辦法阻止每個人提出請求?

您可以使用UUID為頁面的每個“新”加載分配,並從所有不是最新用戶的UUID中刪除請求。 您需要在每個請求中發回UUID。 如果你想獲得高級,你可以讓頁面上的JavaScript檢查響應,看看服務器是否說它是一個舊的UUID,它應該停止發出請求。

使用瀏覽器中即時生成的GUID注冊每個連接。 檢查GUID和用戶名對,以查看最后一個頁面的所有者。 在頁面加載時,聲明自己一個新窗口,並且您正在獲得所有權。 PageJustLoadedMakeMeOwner(myGuid, username)排序PageJustLoadedMakeMeOwner(myGuid, username)

然后讓GUID目標框架定期更新服務器,以獲得它的頁面所有權。

如果它停止更新服務器,則在服務器中設置允許下一頁聯系的規則以獲取該用戶名的所有權。

將失去所有權的頁面自我降級為僅每分鍾訪問一次。

檢查給定頁面是否是該用戶名的所有者的響應非常快。 就客戶所知,幾乎沒時間做。 所以AJAX並沒有真正限制你。

AmIOwner(username, myGuid)檢查的排序(可能每五秒左右執行一次)。 如果是真的,那么做你想要發生的事情。 如果為false,則輪詢以查看頁面所有者是否空缺。 如果是,則取得所有權。 如果為false,則以xx秒數再次輪詢以查看所有者是否空缺。

這有什么意義嗎?

您可以在同一個瀏覽器中為多個實例執行某些操作,但如果用戶有多個瀏覽器,則無法執行任何操作。 (當然,不是那種常見的情況)

如果您仍想嘗試一下,可能最簡單的方法是在cookie中保留最后一個請求的時間戳,並僅在某個閾值時發出新請求。 在多個實例穩定下來之前,您仍然可能會運行一個小型競賽,但如果您使用模糊時間段進行輪詢,則實例應該很快穩定到一個穩定狀態,其中一個實例發出呼叫而其他實例重用最后一次通話的結果。

這種方法的主要優點是可以由任何實例發出請求,因此您不必擔心如果用戶關閉“主要”,則會協商進行調用的“主要”實例並計算回退算法“一個。 主要的缺點是,由於它是基於模糊定時的算法,它不能完全消除競爭條件,偶爾你會有兩個實例發出請求。 你必須稍微調整一下時間,以盡量減少這種情況,但你不能完全阻止它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM