国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

Web項(xiàng)目如何防止客戶端重復(fù)發(fā)送請(qǐng)求

fireflow / 927人閱讀

摘要:在項(xiàng)目中,有一些請(qǐng)求或操作會(huì)對(duì)數(shù)據(jù)產(chǎn)生影響比如新增刪除更新,針對(duì)這類請(qǐng)求一般都需要做一些保護(hù),以防止用戶有意或無(wú)意的重復(fù)發(fā)起這樣的請(qǐng)求導(dǎo)致的數(shù)據(jù)錯(cuò)亂。本文總結(jié)了一些防止客戶端重復(fù)發(fā)送請(qǐng)求的方法。

在Web項(xiàng)目中,有一些請(qǐng)求或操作會(huì)對(duì)數(shù)據(jù)產(chǎn)生影響(比如新增、刪除、更新),針對(duì)這類請(qǐng)求一般都需要做一些保護(hù),以防止用戶有意或無(wú)意的重復(fù)發(fā)起這樣的請(qǐng)求導(dǎo)致的數(shù)據(jù)錯(cuò)亂。

本文總結(jié)了一些防止客戶端重復(fù)發(fā)送請(qǐng)求的方法。

方法一:JS監(jiān)聽(tīng)Form的onsubmit事件

在經(jīng)典場(chǎng)景下,瀏覽器通過(guò)Form發(fā)送請(qǐng)求。因此只需要在Form onsubmit時(shí)將Submit按鈕disable,就能夠防止用戶雙擊導(dǎo)致的重復(fù)請(qǐng)求(這種問(wèn)題一般發(fā)生在年紀(jì)大的用戶身上,他們分不清單擊和雙擊)。

但是隨著前端的發(fā)展,F(xiàn)orm以外的請(qǐng)求方式也越來(lái)越多,比如利用各種前端框架(Vue、AngularJs、Backbone等)寫的App,他們更多的采用的是ajax的方式和后端交互。那么前端開(kāi)發(fā)人員必須在開(kāi)發(fā)時(shí)針對(duì)每個(gè)代表發(fā)起請(qǐng)求的UI元素做處理,像Form一樣,在發(fā)起請(qǐng)求的時(shí)候把相關(guān)UI元素禁用掉。

而有些交互方式則可能連代表發(fā)起請(qǐng)求的UI元素都沒(méi)有,比如Segmentfault的markdown編輯器就是在一邊輸入的時(shí)候一邊保存的。那么這時(shí)就需要前端代碼采用其他手段來(lái)控制重復(fù)請(qǐng)求的發(fā)生。

優(yōu)點(diǎn):

不需要后端寫代碼

缺點(diǎn):

不存在統(tǒng)一的解決方案,必須針對(duì)每種情況寫處理代碼

無(wú)法控制瀏覽器刷新發(fā)起的重復(fù)請(qǐng)求

前端開(kāi)發(fā)人員忘記寫相關(guān)代碼

無(wú)法控制惡意的重復(fù)請(qǐng)求,比如繞過(guò)瀏覽器直接發(fā)起

方法二:Http Status Code 302(后端重定向)

服務(wù)端采用重定向的方式,防止用戶刷新瀏覽器發(fā)出重復(fù)請(qǐng)求。這是比較經(jīng)典的后端控制重復(fù)請(qǐng)求的方式,因?yàn)橐坏?strong>重定向成功后,用戶刷新瀏覽器所刷新的是那個(gè)重定向地址,而不是數(shù)據(jù)操作地址。

優(yōu)點(diǎn):

不需要寫前端代碼

缺點(diǎn):

在還未響應(yīng)302之前,所發(fā)起的重復(fù)請(qǐng)求,比如:用戶快速的雙擊、刷新瀏覽器

在某些前端程序里(比如SPA),不能使用重定向

后端開(kāi)發(fā)人員忘記寫相關(guān)代碼

無(wú)法控制惡意的重復(fù)請(qǐng)求,比如繞過(guò)瀏覽器直接發(fā)起

方法三:結(jié)合方法一和方法二

結(jié)合方法一和方法二的話倒是可以解決大部分問(wèn)題,但是解決不了以下問(wèn)題:

在還未響應(yīng)302之前,用戶刷新瀏覽器導(dǎo)致的重復(fù)請(qǐng)求

有些場(chǎng)景下壓根不能使用重定向

前、后端開(kāi)發(fā)人員忘記寫相關(guān)代碼

無(wú)法控制惡意的重復(fù)請(qǐng)求,比如繞過(guò)瀏覽器直接發(fā)起

方法四:token方式

token的流程是這樣的:

在瀏覽器發(fā)送請(qǐng)求前,先到服務(wù)端索要token

瀏覽器發(fā)送請(qǐng)求時(shí),將token一并提交

服務(wù)端檢查請(qǐng)求是否攜帶token、token是否有效(比如是否正確、是否過(guò)期)。如果不正確則響應(yīng)失敗;如果正確則銷毀token,繼續(xù)業(yè)務(wù)邏輯。

關(guān)鍵點(diǎn)在于:

每個(gè)token都是一次性且有過(guò)期時(shí)間的,能夠防止token前端代碼bug造成的重復(fù)利用和無(wú)限利用。

服務(wù)器要求請(qǐng)求必須攜帶token,能夠避免前端開(kāi)發(fā)人員漏寫相關(guān)代碼。

那么token是以怎樣的形式傳輸?shù)哪兀课艺J(rèn)為有以下兩種方式:

Cookie

推薦使用這種方式,因?yàn)闉g覽器每次都會(huì)將cookie攜帶在請(qǐng)求里一并發(fā)出,所以前端發(fā)送請(qǐng)求的代碼都不需要修改,只要在發(fā)送請(qǐng)求前問(wèn)服務(wù)器拿token就行了。

比如在進(jìn)入Form頁(yè)面時(shí),服務(wù)器將token以cookie的形式一并攜帶在響應(yīng)中,那么前端Form提交時(shí),就會(huì)將cookie一并攜帶在請(qǐng)求中,前端的代碼一點(diǎn)都不需要修改。

json

前端發(fā)起ajax請(qǐng)求像后端拿token,后端以json的形式返回token,前端發(fā)送請(qǐng)求時(shí)將token攜帶在請(qǐng)求中,后端檢驗(yàn)。

這種方式比Cookie稍微麻煩的地方是,前端必須寫一些代碼來(lái)保存這個(gè)token,然后在發(fā)送請(qǐng)求的地方要寫一些代碼把token攜帶在請(qǐng)求里。

優(yōu)點(diǎn)

前端代碼可以寫的少一些,比如禁用UI元素的代碼可以不寫

能夠解決在還未響應(yīng)302之前,用戶刷新瀏覽器導(dǎo)致的重復(fù)請(qǐng)求

適應(yīng)有些場(chǎng)景下壓根不能使用重定向

缺點(diǎn)

前、后端開(kāi)發(fā)人員忘記寫相關(guān)代碼。這個(gè)真的解決不了。

無(wú)法控制通過(guò)腳本運(yùn)行的,具有整套流程的惡意請(qǐng)求。這種請(qǐng)求在程序看來(lái)完全合法,但卻屬于惡意行為,針對(duì)這類惡意行為的防控屬于另一個(gè)話題,本人不懂,所以在這里就不多講了。

方法五:利用數(shù)據(jù)庫(kù)的唯一約束

如果請(qǐng)求會(huì)insert數(shù)據(jù),而這個(gè)數(shù)據(jù)正好存在業(yè)務(wù)主鍵,那么可以利用數(shù)據(jù)庫(kù)的唯一約束來(lái)做進(jìn)一步的防御。

方法六:請(qǐng)求冪等化

有些業(yè)務(wù)情形下,請(qǐng)求是冪等的,這就意味著可以不用為重復(fù)發(fā)生請(qǐng)求而煩惱了——至少在業(yè)務(wù)邏輯層面不用煩惱了。

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/87004.html

相關(guān)文章

  • Web項(xiàng)目如何防止戶端重復(fù)發(fā)送請(qǐng)求

    摘要:在項(xiàng)目中,有一些請(qǐng)求或操作會(huì)對(duì)數(shù)據(jù)產(chǎn)生影響比如新增刪除更新,針對(duì)這類請(qǐng)求一般都需要做一些保護(hù),以防止用戶有意或無(wú)意的重復(fù)發(fā)起這樣的請(qǐng)求導(dǎo)致的數(shù)據(jù)錯(cuò)亂。本文總結(jié)了一些防止客戶端重復(fù)發(fā)送請(qǐng)求的方法。 在Web項(xiàng)目中,有一些請(qǐng)求或操作會(huì)對(duì)數(shù)據(jù)產(chǎn)生影響(比如新增、刪除、更新),針對(duì)這類請(qǐng)求一般都需要做一些保護(hù),以防止用戶有意或無(wú)意的重復(fù)發(fā)起這樣的請(qǐng)求導(dǎo)致的數(shù)據(jù)錯(cuò)亂。 本文總結(jié)了一些防止客戶端重...

    sewerganger 評(píng)論0 收藏0
  • 從零開(kāi)始搭建論壇(一):Web服務(wù)器與Web框架

    摘要:服務(wù)器通過(guò)協(xié)議與客戶端通信,因此也被稱為服務(wù)器。本文標(biāo)題為從零開(kāi)始搭建論壇一服務(wù)器與框架本文鏈接為更多閱讀自己動(dòng)手開(kāi)發(fā)網(wǎng)絡(luò)服務(wù)器一自己動(dòng)手開(kāi)發(fā)網(wǎng)絡(luò)服務(wù)器二自己動(dòng)手開(kāi)發(fā)網(wǎng)絡(luò)服務(wù)器三服務(wù)器網(wǎng)關(guān)接口實(shí)現(xiàn)原理分析最佳實(shí)踐指南應(yīng)用淺談框架編程簡(jiǎn)介 之前用 Django 做過(guò)一個(gè)小的站點(diǎn),感覺(jué)Django太過(guò)笨重,于是就準(zhǔn)備換一個(gè)比較輕量級(jí)的 Web 框架來(lái)玩玩。Web.py 作者已經(jīng)掛掉,項(xiàng)目好...

    dantezhao 評(píng)論0 收藏0
  • javascript知識(shí)點(diǎn)

    摘要:握手過(guò)程中使用了的標(biāo)志和。接收端收到后,回傳一個(gè)帶有標(biāo)志的數(shù)據(jù)包以示傳達(dá)確認(rèn)信息。第四次揮手主動(dòng)關(guān)閉方收到后,發(fā)送一個(gè)給被動(dòng)關(guān)閉方,確認(rèn)序號(hào)為收到序號(hào),至此,完成四次揮手。其次,通過(guò)使和系統(tǒng)綁定來(lái)降低泄露后的危險(xiǎn)。 一些開(kāi)放性題目 1.自我介紹:除了基本個(gè)人信息以外,面試官更想聽(tīng)的是你與眾不同的地方和你的優(yōu)勢(shì)。 2.項(xiàng)目介紹 3.如何看待前端開(kāi)發(fā)? 4.平時(shí)是如何學(xué)習(xí)前端開(kāi)發(fā)的? 5....

    zhangxiangliang 評(píng)論0 收藏0
  • 超實(shí)用百道Java面試題

    摘要:是的簡(jiǎn)稱,運(yùn)行環(huán)境,為的運(yùn)行提供了所需的環(huán)境。分割字符串,返回分割后的字符串?dāng)?shù)組。當(dāng)計(jì)算的值相同時(shí),我們稱之為沖突,的做法是用鏈表和紅黑樹(shù)存儲(chǔ)相同的值的。迭代器取代了集合框架中的,迭代器允許調(diào)用者在迭代過(guò)程中移除元素。 Java基礎(chǔ)1.JDK和JRE有什么區(qū)別? JDK 是java development kit的簡(jiǎn)稱,java開(kāi)發(fā)工具包,提供java的開(kāi)發(fā)環(huán)境和運(yùn)行環(huán)境。JRE 是j...

    MkkHou 評(píng)論0 收藏0
  • 【備戰(zhàn)春招/秋招系列】美團(tuán)面經(jīng)總結(jié)基礎(chǔ)篇 (附詳解答案)

    摘要:不同于個(gè)人面經(jīng),這份面經(jīng)具有普適性。我在前面的文章中也提到了應(yīng)該怎么做自我介紹與項(xiàng)目介紹,詳情可以查看這篇文章備戰(zhàn)春招秋招系列初出茅廬的程序員該如何準(zhǔn)備面試。是建立連接時(shí)使用的握手信號(hào)。它表示確認(rèn)發(fā)來(lái)的數(shù)據(jù)已經(jīng)接受無(wú)誤。 showImg(https://segmentfault.com/img/remote/1460000016972448?w=921&h=532); 該文已加入開(kāi)源文...

    Leck1e 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<