-
1 # 程式碼大叔
-
2 # UnicornBoat
請求由使用者控制的時候,容易發生重複。
前端用變數控制為每個專用ajax設定一個boolean變數,當所代表的ajax啟動時設定為1,結束時設定為0。也就是說該ajax啟動的條件是這個變數為0。如果請求不被允許可以直接return也可以排隊,然後由setInterval來檢查,隊伍清空後要clearInterval。
後端由cookie控制根據ajax發來的請求判斷是否同一個使用者的請求,可以由IP和cookie中的key來判斷,也可以由session判斷。該使用者上一個同類ajax未結束前可以返回錯誤,儘量不要在後端排隊。
-
3 # 從頭開始自學java
你的做法是在客戶端進行限制。
客戶端方案在同一個頁面,也就是說使用者沒有離開某個頁面,那麼使用disabled的方式也是無可厚非的,並沒有什麼粗暴之說。
為什麼會覺得這種方式不好呢?
問題分析按照常理來說,同一個使用者在某一段時間內不應該對某個請求發起多次請求。
不過很難界定多短算一段時間之內,特別是考慮到網路延遲等因素。
也很難界定是否是使用者自己的操作。
所以只要是在同一個介面,我們都認為使用者不應該多次操作。
表單直接提交方式這是我非常不建議的方案,假如採用提交之後務必要跳轉到另外一個頁面,否則使用者重新整理當前頁面會導致重複提交。
把請求結果快取下來如果使用者在某一段時間之內請求的是同一個URL,那麼可以把之前快取在客戶端的資料直接取出來展示。
如果是當前頁面就告訴他請過多久再請求。
像阿里巴巴那樣,當一段時間之內請求超過一定次數之後,就驗證使用者的合法性,比如輸入驗證碼。
記住這是限制機器請求,不是限制正常使用者的無聊之舉。
服務端快取客戶端可以快取,服務端自然也可以快取。
使用者請求過的資料就快取起來,下次請求直接返回。
評價你會發現你覺得暴力的方式才是這個世界上最完美的方式,假如你想採用其他方式,會發現需要大量工作,建議最好是在伺服器集中式處理,這樣可以一勞永逸。
-
4 # 我就哼哈了
兩個辦法
其一是在ajax執行前加一個變數預設為false,ajax每次執行前都判斷變數是否為false,是的話就進入ajax,同時將變數賦值為true。這樣重複點選無法進入ajax執行程式碼中。最後在ajax成功,或者失敗都把變數設定回false,就可以實現
其二是用jquery的ajaxprefilter,這個函式在每次ajax的時候都會進入。透過函式傳參,知道當前ajax的URL是什麼。這樣就能知道是不是重複請求,是的話,直接用ajaxprefilter傳回的jqxhr變數,abrot掉這個ajax請求就完了
-
5 # 純潔的激進派
到現在的ajax,由於js是單執行緒執行,控制起來要方便很多。一般用一個全域性變數控制。點選後判斷是否在提交中,如是,返回,如不是,設定控制變數為提交中。ajax觸發complete時,將控制變數設為非提交,可能的話,ajax呼叫加try...catch...,catch時也設定未非提交。
伺服器端也可以一定程度上控制重複提交。比如介面路徑和引數和令牌組合產生簽名儲存在redis或者session中,再加上時間戳。一定間隔內,如果簽名相同,這返回提交重複錯誤。
一個簡易的需求,點一個按鈕,則向伺服器請求資源,不作處理時,多次點選後會有很多個請求在等待。粗暴的解決方式是點一次就將按鈕disable掉。請問一下有沒有更好的辦法?
回覆列表
簡單的回答就是:不要重複傳送相同的Ajax請求!
如何做到? 那就要有一定的經驗和邏輯處理能力
Ajax 即“Asynchronous Javascript And XML”(非同步 JavaScript 和 XML),是指一種建立互動式網頁應用的網頁開發技術。Ajax 是一種在無需重新載入整個網頁的情況下,能夠更新部分網頁的技術。我們用一個例子來說明一下:
現在要求每隔5秒鐘用Ajax去向後臺請求一次資料,並把資料放到ID為XX的DIV裡
假設後臺訪問地址:http://127.0.0.1/getdata
用jQuery外掛來舉例
先說容易犯錯的可能性, 上程式碼:
一眼看去, 沒毛病,頁面載入完成後開始每隔5秒利用Ajax去拿一次資料,並放到指定的DIV裡
但實際執行的時候,因為各種原因(比如網路延遲),會導致上次資料沒Load到, 第2次請求又到時間了,結果開始出現重複請求
嚴重的話簡直會排著隊在不停的請求都有可能!
上面問題導致的最根本原因是沒考慮請求資料時有可能出現的延遲,我們來改進一下:
程式碼比上面稍長,但它解決幾個問題:
- 改用了setTimeout定時器,避免反覆傳送Ajax請求
- 修改了下次取資料的機制, 變成當前這次請求資料完成後才開始計時5秒再執行下次請求資料
這樣可以杜絕了重複傳送Ajax請求的需求
當然了, 上次這個方法也還有瑕疵
比如說當某次Ajax請求出錯時,每隔5秒請求就再也不會執行了,程式就此中斷
解決辦法當然是有的,但已經是另一個話題了
有了上面的例子, 題主的問題就好解決, 思路如下: