摘要:在項目中,有一些請求或操作會對數據產生影響比如新增刪除更新,針對這類請求一般都需要做一些保護,以防止用戶有意或無意的重復發起這樣的請求導致的數據錯亂。本文總結了一些防止客戶端重復發送請求的方法。
在Web項目中,有一些請求或操作會對數據產生影響(比如新增、刪除、更新),針對這類請求一般都需要做一些保護,以防止用戶有意或無意的重復發起這樣的請求導致的數據錯亂。
本文總結了一些防止客戶端重復發送請求的方法。
方法一:JS監聽Form的onsubmit事件在經典場景下,瀏覽器通過Form發送請求。因此只需要在Form onsubmit時將Submit按鈕disable,就能夠防止用戶雙擊導致的重復請求(這種問題一般發生在年紀大的用戶身上,他們分不清單擊和雙擊)。
但是隨著前端的發展,Form以外的請求方式也越來越多,比如利用各種前端框架(Vue、AngularJs、Backbone等)寫的App,他們更多的采用的是ajax的方式和后端交互。那么前端開發人員必須在開發時針對每個代表發起請求的UI元素做處理,像Form一樣,在發起請求的時候把相關UI元素禁用掉。
而有些交互方式則可能連代表發起請求的UI元素都沒有,比如Segmentfault的markdown編輯器就是在一邊輸入的時候一邊保存的。那么這時就需要前端代碼采用其他手段來控制重復請求的發生。
優點:
不需要后端寫代碼
缺點:
不存在統一的解決方案,必須針對每種情況寫處理代碼
無法控制瀏覽器刷新發起的重復請求
前端開發人員忘記寫相關代碼
無法控制惡意的重復請求,比如繞過瀏覽器直接發起
方法二:Http Status Code 302(后端重定向)服務端采用重定向的方式,防止用戶刷新瀏覽器發出重復請求。這是比較經典的后端控制重復請求的方式,因為一旦重定向成功后,用戶刷新瀏覽器所刷新的是那個重定向地址,而不是數據操作地址。
優點:
不需要寫前端代碼
缺點:
在還未響應302之前,所發起的重復請求,比如:用戶快速的雙擊、刷新瀏覽器
在某些前端程序里(比如SPA),不能使用重定向
后端開發人員忘記寫相關代碼
無法控制惡意的重復請求,比如繞過瀏覽器直接發起
方法三:結合方法一和方法二結合方法一和方法二的話倒是可以解決大部分問題,但是解決不了以下問題:
在還未響應302之前,用戶刷新瀏覽器導致的重復請求
有些場景下壓根不能使用重定向
前、后端開發人員忘記寫相關代碼
無法控制惡意的重復請求,比如繞過瀏覽器直接發起
方法四:token方式token的流程是這樣的:
在瀏覽器發送請求前,先到服務端索要token
瀏覽器發送請求時,將token一并提交
服務端檢查請求是否攜帶token、token是否有效(比如是否正確、是否過期)。如果不正確則響應失敗;如果正確則銷毀token,繼續業務邏輯。
關鍵點在于:
每個token都是一次性且有過期時間的,能夠防止token前端代碼bug造成的重復利用和無限利用。
服務器要求請求必須攜帶token,能夠避免前端開發人員漏寫相關代碼。
那么token是以怎樣的形式傳輸的呢?我認為有以下兩種方式:
Cookie:
推薦使用這種方式,因為瀏覽器每次都會將cookie攜帶在請求里一并發出,所以前端發送請求的代碼都不需要修改,只要在發送請求前問服務器拿token就行了。
比如在進入Form頁面時,服務器將token以cookie的形式一并攜帶在響應中,那么前端Form提交時,就會將cookie一并攜帶在請求中,前端的代碼一點都不需要修改。
json:
前端發起ajax請求像后端拿token,后端以json的形式返回token,前端發送請求時將token攜帶在請求中,后端檢驗。
這種方式比Cookie稍微麻煩的地方是,前端必須寫一些代碼來保存這個token,然后在發送請求的地方要寫一些代碼把token攜帶在請求里。
優點:
前端代碼可以寫的少一些,比如禁用UI元素的代碼可以不寫
能夠解決在還未響應302之前,用戶刷新瀏覽器導致的重復請求
適應有些場景下壓根不能使用重定向
缺點:
前、后端開發人員忘記寫相關代碼。這個真的解決不了。
無法控制通過腳本運行的,具有整套流程的惡意請求。這種請求在程序看來完全合法,但卻屬于惡意行為,針對這類惡意行為的防控屬于另一個話題,本人不懂,所以在這里就不多講了。
方法五:利用數據庫的唯一約束如果請求會insert數據,而這個數據正好存在業務主鍵,那么可以利用數據庫的唯一約束來做進一步的防御。
方法六:請求冪等化有些業務情形下,請求是冪等的,這就意味著可以不用為重復發生請求而煩惱了——至少在業務邏輯層面不用煩惱了。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/87004.html
摘要:在項目中,有一些請求或操作會對數據產生影響比如新增刪除更新,針對這類請求一般都需要做一些保護,以防止用戶有意或無意的重復發起這樣的請求導致的數據錯亂。本文總結了一些防止客戶端重復發送請求的方法。 在Web項目中,有一些請求或操作會對數據產生影響(比如新增、刪除、更新),針對這類請求一般都需要做一些保護,以防止用戶有意或無意的重復發起這樣的請求導致的數據錯亂。 本文總結了一些防止客戶端重...
摘要:服務器通過協議與客戶端通信,因此也被稱為服務器。本文標題為從零開始搭建論壇一服務器與框架本文鏈接為更多閱讀自己動手開發網絡服務器一自己動手開發網絡服務器二自己動手開發網絡服務器三服務器網關接口實現原理分析最佳實踐指南應用淺談框架編程簡介 之前用 Django 做過一個小的站點,感覺Django太過笨重,于是就準備換一個比較輕量級的 Web 框架來玩玩。Web.py 作者已經掛掉,項目好...
摘要:握手過程中使用了的標志和。接收端收到后,回傳一個帶有標志的數據包以示傳達確認信息。第四次揮手主動關閉方收到后,發送一個給被動關閉方,確認序號為收到序號,至此,完成四次揮手。其次,通過使和系統綁定來降低泄露后的危險。 一些開放性題目 1.自我介紹:除了基本個人信息以外,面試官更想聽的是你與眾不同的地方和你的優勢。 2.項目介紹 3.如何看待前端開發? 4.平時是如何學習前端開發的? 5....
摘要:是的簡稱,運行環境,為的運行提供了所需的環境。分割字符串,返回分割后的字符串數組。當計算的值相同時,我們稱之為沖突,的做法是用鏈表和紅黑樹存儲相同的值的。迭代器取代了集合框架中的,迭代器允許調用者在迭代過程中移除元素。 Java基礎1.JDK和JRE有什么區別? JDK 是java development kit的簡稱,java開發工具包,提供java的開發環境和運行環境。JRE 是j...
摘要:不同于個人面經,這份面經具有普適性。我在前面的文章中也提到了應該怎么做自我介紹與項目介紹,詳情可以查看這篇文章備戰春招秋招系列初出茅廬的程序員該如何準備面試。是建立連接時使用的握手信號。它表示確認發來的數據已經接受無誤。 showImg(https://segmentfault.com/img/remote/1460000016972448?w=921&h=532); 該文已加入開源文...
閱讀 2655·2021-09-13 10:26
閱讀 1915·2021-09-03 10:28
閱讀 1986·2019-08-30 15:44
閱讀 804·2019-08-29 14:07
閱讀 393·2019-08-29 13:12
閱讀 2150·2019-08-26 11:44
閱讀 2344·2019-08-26 11:36
閱讀 2013·2019-08-26 10:19