java 防止url重復請求_Web項目如何防止客戶端重復發送請求

在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://www.pswp.cn/news/457242.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/457242.shtml
英文地址,請注明出處:http://en.pswp.cn/news/457242.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【bzoj1010-toy】斜率優化入門模板

dsy1010: [HNOI2008]玩具裝箱 【題目描述】 有n個數&#xff0c;分成連續的若干段&#xff0c;每段&#xff08;假設從第j個到第i個組成一段&#xff09;的分數為 (X-L)^2&#xff0c;X為j-iSigma(Ck) i<k<j&#xff0c;其中L是一個常量。目標&#xff1a;各段分數的總和…

itellyou操作系統,office等軟件的很全的下載站

itellyou操作系統&#xff0c;office等軟件的很全的下載站http://www.itellyou.cn/轉載于:https://blog.51cto.com/wangheyu1/1894724

矩陣的馬鞍點

#include<stdio.h>#define n 4//馬鞍點是第I行值最小第J列值最大 void maxmin(int a[n][n]){ int i,j ,flag; int max[n],min[n]; for(i0;i<n;i) { min[i]a[i][0];//將數組每行的第一個元素賦值給min[]數組 for(j1;j<n;j) { if(a[i][j]<min[i]) min[i]a[i][j];…

Linux運維工程師面試-部分題庫

一、Linux操作系統知識 1.常見的Linux發行版本都有什么&#xff1f;你最擅長哪一個&#xff1f;它的官網網站是什么&#xff1f;說明你擅長哪一塊&#xff1f; 2.Linux開機啟動流程詳細步驟是什么&#xff1f;系統安裝完&#xff0c;忘記密碼如何破解&#xff1f; 3.企業中Linu…

java統計系統線程數_Java并發(八)計算線程池最佳線程數

目錄一、理論分析二、實際應用為了加快程序處理速度&#xff0c;我們會將問題分解成若干個并發執行的任務。并且創建線程池&#xff0c;將任務委派給線程池中的線程&#xff0c;以便使它們可以并發地執行。在高并發的情況下采用線程池&#xff0c;可以有效降低線程創建釋放的時…

php大小寫轉換函數

1.將字符串轉換成小寫 strtolower(): 該函數將傳入的字符串參數所有的字符都轉換成小寫,并以小定形式放回這個字 符串.例: <?php$str "I want To FLY";$str strtolower($str);echo $str; ?>輸出結果: i want to fly 2.將字符轉成大寫 strtoupper(): 該…

關于移動端 1px 像素問題

移動端1px變粗的原因 移動端html的header總會有一句<meta name"viewport" content"widthdevice-width, initial-scale1.0, maximum-scale1.0, user-scalableno">這句話定義了本頁面的viewport的寬度為設備寬度,初始縮放值和最大縮放值都為1,并禁止了…

java框架概念_java概念(2)

java概念(2)重載和重寫重載&#xff1a;同一個類中&#xff0c;方法名相同&#xff0c;參數不同重寫&#xff1a;父子類中&#xff0c;子類重新定義父類的方法多態? 多態&#xff1a;同一種行為&#xff0c;不同的對象有不同的表現形式。? 重載 編譯時根據參數決定調用的方法…

CentOS(八)--crontab命令的使用方法

crontab命令常見于Unix和Linux的操作系統之中&#xff0c;用于設置周期性被執行的指令。該命令從標準輸入設備讀取指令&#xff0c;并將其存放于"crontab"文件中&#xff0c;以供之后讀取和執行。 在Linux系統中&#xff0c;Linux任務調度的工作主要分為以下兩類&…

有健忘癥嗎?

今天興高采烈&#xff0c;早上空氣不錯&#xff0c; 但是騎自行車的我&#xff0c;還是得戴一個面罩。 半個小時后買了早餐&#xff0c; 一份炒粉、一豆漿&#xff0c;今天早上豆漿沒有掉地上&#xff0c; 但是~~~~~~~~~~~~~~shit~~!~!~,居然忘記帶要換的衣服了&#xff0c; …

下載java后綴的文件閃退_關于jarfile 打開閃退問題

后面才發現&#xff0c;原來是因為我把文件拖入了新建的文件夾&#xff0c;改變了路徑&#xff0c;而且我的java環境沒有配置好是全局變量&#xff0c;所以新建文件夾之后&#xff0c;就會出現找不到了路徑&#xff0c;閃退的問題&#xff0c;&#xff0c;&#xff0c;還有就是…

心理學資源整理

http://blog.sina.com.cn/s/articlelist_1227187337_0_1.html 功夫 轉載2016-06-07 15:53:55中華大地的武學&#xff0c;奧妙精深。但從大的方面來說&#xff0c;可分為內外軟硬&#xff0c;有形無形的區別。注重于外&#xff0c;修煉筋骨皮肉的是有形的功夫&#xff1b;注重于…

[已解決]Vistual Stdio 2015 installer Bootstrapper Packages 路徑

VS2015 installer 的預裝包的地址變更成 C:\Program Files (x86)\Microsoft Visual Studio 14.0\SDK\Bootstrapper\Packages 參看文檔&#xff1a;https://msdn.microsoft.com/en-us/library/ms165429(vvs.140).aspx 之前的版本是在 C:\Program Files (x86)\Microsoft SDKs\Win…

java怎樣寫入五個人的成績_用java輸入5個學員姓名和分數,顯示分數最高的學員姓名和分數?...

展開全部import java.util.Scanner;public class Student {private String stuname "";private float stuscore 0;public String getStuname() {e69da5e6ba9062616964757a686964616f31333335316633return stuname;}public void setStuname(String stuname) {this.s…

eBay宣布發布全新的購買和銷售APIs

eBay最近宣布發布兩款全新的購買和銷售APIs。這些APIs旨在促進eBay產品在第三方應用程序中的更好集成。eBay于10月19日在他們的博客上發表了幾篇文章&#xff0c;不僅詳細介紹了這些全新的購買和銷售APIs提供的功能&#xff0c;而且還詳細地總結了他們公司從SOAP&#xff08;簡…

iOS 10 升級后無法真機測試 Could not find Developer Disk Image

&#xff0d;&#xff0d;&#xff0d;2016年9月20日更新 iOS 升級到10之后&#xff0c;你會發現無法進行真機測試了。這種情況我在iOS 8.4 、9.3更新的時候也遇到過。原因是Xcode 的DeviceSupport里面缺少了iOS 10的SDK。所以你可以選擇將Xcode更新到最新版本就可以了&#xf…

java虛擬機參數優化_JAVA虛擬機JVM參數優化(2):垃圾收集算法選擇

JAVA虛擬機JVM優化重要性&#xff0c;昨天JAVA虛擬機JVM參數優化(1)文章中已經描述&#xff0c;今天我們來討論JAVA虛擬機在不同性能要求下如何選擇三種垃圾收集算法。JVM內部結構如下圖所示&#xff1a;串行收集用于單個線程執行垃圾收集的情況&#xff0c;在這種情況下相對它…

Dubbo與Zookeeper、SpringMVC整合和使用(負載均衡、容錯)

2019獨角獸企業重金招聘Python工程師標準>>> 互聯網的發展&#xff0c;網站應用的規模不斷擴大&#xff0c;常規的垂直應用架構已無法應對&#xff0c;分布式服務架構以及流動計算架構勢在必行&#xff0c;Dubbo是一個分布式服務框架&#xff0c;在這種情況下誕生的…

java clicked_關于java:JComponents在調用mouseClicked()之后消失

我正在用Swing編寫Java GUI程序。該界面如下所示&#xff1a;當用戶單擊右側的圖片之一時&#xff0c;我希望它的一個小的預覽顯示在左上角的橙色區域中。我通過SwingWorker線程從計算機上的目錄中提取所有圖像文件。在SwingWorker的done()方法中&#xff0c;我向每個對象添加了…

vim簡單命令教程-firstblood

你想以最快的速度學習人類史上最好的文本編輯器VIM嗎&#xff1f;你先得懂得如何在VIM幸存下來&#xff0c;然后一點一點地學習各種戲法。 Vim the Six Billion Dollar editor Better, Stronger, Faster. 學習 vim 并且其會成為你最后一個使用的文本編輯器。沒有比這個更好的文…