java 防止url重复请求_Web项目如何防止客户端重复发送请求
在Web項目中,有一些請求或操作會對數(shù)據(jù)產(chǎn)生影響(比如新增、刪除、更新),針對這類請求一般都需要做一些保護,以防止用戶有意或無意的重復(fù)發(fā)起這樣的請求導(dǎo)致的數(shù)據(jù)錯亂。
本文總結(jié)了一些防止客戶端重復(fù)發(fā)送請求的方法。
方法一:JS監(jiān)聽Form的onsubmit事件
在經(jīng)典場景下,瀏覽器通過Form發(fā)送請求。因此只需要在Form onsubmit時將Submit按鈕disable,就能夠防止用戶雙擊導(dǎo)致的重復(fù)請求(這種問題一般發(fā)生在年紀大的用戶身上,他們分不清單擊和雙擊)。
但是隨著前端的發(fā)展,Form以外的請求方式也越來越多,比如利用各種前端框架(Vue、AngularJs、Backbone等)寫的App,他們更多的采用的是ajax的方式和后端交互。那么前端開發(fā)人員必須在開發(fā)時針對每個代表發(fā)起請求的UI元素做處理,像Form一樣,在發(fā)起請求的時候把相關(guān)UI元素禁用掉。
而有些交互方式則可能連代表發(fā)起請求的UI元素都沒有,比如Segmentfault的markdown編輯器就是在一邊輸入的時候一邊保存的。那么這時就需要前端代碼采用其他手段來控制重復(fù)請求的發(fā)生。
優(yōu)點:
不需要后端寫代碼
缺點:
不存在統(tǒng)一的解決方案,必須針對每種情況寫處理代碼
無法控制瀏覽器刷新發(fā)起的重復(fù)請求
前端開發(fā)人員忘記寫相關(guān)代碼
無法控制惡意的重復(fù)請求,比如繞過瀏覽器直接發(fā)起
方法二:Http Status Code 302(后端重定向)
服務(wù)端采用重定向的方式,防止用戶刷新瀏覽器發(fā)出重復(fù)請求。這是比較經(jīng)典的后端控制重復(fù)請求的方式,因為一旦重定向成功后,用戶刷新瀏覽器所刷新的是那個重定向地址,而不是數(shù)據(jù)操作地址。
優(yōu)點:
不需要寫前端代碼
缺點:
在還未響應(yīng)302之前,所發(fā)起的重復(fù)請求,比如:用戶快速的雙擊、刷新瀏覽器
在某些前端程序里(比如SPA),不能使用重定向
后端開發(fā)人員忘記寫相關(guān)代碼
無法控制惡意的重復(fù)請求,比如繞過瀏覽器直接發(fā)起
方法三:結(jié)合方法一和方法二
結(jié)合方法一和方法二的話倒是可以解決大部分問題,但是解決不了以下問題:
在還未響應(yīng)302之前,用戶刷新瀏覽器導(dǎo)致的重復(fù)請求
有些場景下壓根不能使用重定向
前、后端開發(fā)人員忘記寫相關(guān)代碼
無法控制惡意的重復(fù)請求,比如繞過瀏覽器直接發(fā)起
方法四:token方式
token的流程是這樣的:
在瀏覽器發(fā)送請求前,先到服務(wù)端索要token
瀏覽器發(fā)送請求時,將token一并提交
服務(wù)端檢查請求是否攜帶token、token是否有效(比如是否正確、是否過期)。如果不正確則響應(yīng)失敗;如果正確則銷毀token,繼續(xù)業(yè)務(wù)邏輯。
關(guān)鍵點在于:
每個token都是一次性且有過期時間的,能夠防止token前端代碼bug造成的重復(fù)利用和無限利用。
服務(wù)器要求請求必須攜帶token,能夠避免前端開發(fā)人員漏寫相關(guān)代碼。
那么token是以怎樣的形式傳輸?shù)哪?#xff1f;我認為有以下兩種方式:
Cookie:
推薦使用這種方式,因為瀏覽器每次都會將cookie攜帶在請求里一并發(fā)出,所以前端發(fā)送請求的代碼都不需要修改,只要在發(fā)送請求前問服務(wù)器拿token就行了。
比如在進入Form頁面時,服務(wù)器將token以cookie的形式一并攜帶在響應(yīng)中,那么前端Form提交時,就會將cookie一并攜帶在請求中,前端的代碼一點都不需要修改。
json:
前端發(fā)起ajax請求像后端拿token,后端以json的形式返回token,前端發(fā)送請求時將token攜帶在請求中,后端檢驗。
這種方式比Cookie稍微麻煩的地方是,前端必須寫一些代碼來保存這個token,然后在發(fā)送請求的地方要寫一些代碼把token攜帶在請求里。
優(yōu)點:
前端代碼可以寫的少一些,比如禁用UI元素的代碼可以不寫
能夠解決在還未響應(yīng)302之前,用戶刷新瀏覽器導(dǎo)致的重復(fù)請求
適應(yīng)有些場景下壓根不能使用重定向
缺點:
前、后端開發(fā)人員忘記寫相關(guān)代碼。這個真的解決不了。
無法控制通過腳本運行的,具有整套流程的惡意請求。這種請求在程序看來完全合法,但卻屬于惡意行為,針對這類惡意行為的防控屬于另一個話題,本人不懂,所以在這里就不多講了。
方法五:利用數(shù)據(jù)庫的唯一約束
如果請求會insert數(shù)據(jù),而這個數(shù)據(jù)正好存在業(yè)務(wù)主鍵,那么可以利用數(shù)據(jù)庫的唯一約束來做進一步的防御。
方法六:請求冪等化
有些業(yè)務(wù)情形下,請求是冪等的,這就意味著可以不用為重復(fù)發(fā)生請求而煩惱了——至少在業(yè)務(wù)邏輯層面不用煩惱了。
總結(jié)
以上是生活随笔為你收集整理的java 防止url重复请求_Web项目如何防止客户端重复发送请求的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 等压线上怎么画风向_如何利用等压线图判定
- 下一篇: java基站定位接口实例