防重複提交方案

2021-09-25 12:59:31 字數 1856 閱讀 6267

因為服務端是使用token來獲取使用者資訊,沒有對應的session管理機制,不能用sessionid加上使用者請求的url作為唯一標識。但是伺服器中的userid是用雪花演算法進行計算,能確保唯一性,所以我們選擇用userid加上使用者請求的url作為使用者請求的唯一標識。當使用者請求post、put、delete介面時,快取使用者的userid加上請求的位址,設定超時時間為2秒鐘,當這個使用者重複請求這個位址的時候,判斷是否在快取中,如果在快取中,則進行攔截,2秒後使用者才可以請求這個介面。

2.1編寫aop切面對所有請求到controller層的請求進行攔截

2.1在資料庫中獲取要攔截的路徑,為了防止多次請求資料庫導致效能下降,但是又要定時的重新整理快取,把查詢的資料加入快取中,快取的時間為1個小時。

2.2判斷使用者的請求是否在快取中,如果在快取中,則友好提示使用者不能頻繁操作。如果不在快取中,則加入快取,快取失效時間為2秒鐘。

說明:這裡的快取用的是hazelcast,因為hazelcast鎖和超時時間不能在一行**中執行,如果併發請求實現不了防重複提交,建議替換成redis。

/**

* 切入controller層,對配置的位址進行判斷,如果2秒內重複提交多次則進行攔截

* (攔截的位址自己進行編寫)

*/@before

("within(com.*.*.web.controller.*)"

)public

void

before()

string servletpath = path;

// 查詢防重複路徑(查詢資料庫獲取過來的資料,快取在hazelcast中,超時時間為1個小時)

sysparameter sysparameter =

findduplicationpath()

;if(sysparameter == null)

// 判斷請求位址是否是防重複位址

string[

] prmvalue = sysparameter.

getprmvalue()

.split

(",");

long count = arrays.

stream

(prmvalue)

.filter

(value -

> value.

equals

(servletpath)).

count()

;if(count <=0)

不是要檢測路徑,退出"

,servletpath)

;return;}

// 獲取登入的使用者id

long userid = jwttokenutils.

decodetoken

(request.

getheader

(commonconstant.token));

// 快取key

string uniquekey = servletpath + userid;

// 檢查快取中是否有對應的請求位址

object result = hazelcastutils.

get(insuranceconstant.preventing_duplication_aspect, uniquekey);if

(result == null)

else

,{}秒內重複提交,友好提示"

,servletpath,preduplicationsecond)

;throw

newbusines***ception

(insuranceerrorcodeenum.requests_are_too_frequent);}

}

函式防抖(防表單重複提交)

在前端開發中,常常需要對某些函式進行節流和防抖。目前針對不同場景防抖方案也較多,其中lodash和rxjs中提供的方案,是一種被廣泛使用的方案,其通用性也較強,使用簡單,可以覆蓋我們大部分的業務場景。即 當呼叫函式n毫秒後,才會執行該動作,若在這n毫秒內又呼叫該函式則將取消前一次計時並重新計算執行時...

頁面按鈕防重複提交

防重複提交isallowclicksubmitbtn true,var isallowclicksubmitbtn that.data.isallowclicksubmitbtn 第一次進入 false 返回,不執行 第二次進入 ture 執行中斷 if isallowclicksubmitbtn ...

struts2防重複提交

1.頁面 需要在頁面上加,頁面示例如下 使用者名稱name 密碼password 2.struts.xml register web inf page profile register.jsp web inf page profile fail.jsp web inf page profile re...