国产精品一区二区久久久-99久久久精品免费看国产-久久九九99热这里只有精品-漂亮人妻被中出中文字幕久久-五月情综合网站久久-福利姬3d全彩办公室色欲-av网站在线播放网站-亚洲日本岛国动作片在线观看-男人的天堂啊啊啊啊

日志樣式

小程序開發(fā)實(shí)戰(zhàn)經(jīng)驗(yàn),防重復(fù)提交解決方案!史上最全原理解析!.

  • 標(biāo)簽 :

傳統(tǒng)方式(不推薦)

首先我們介紹下之前傳統(tǒng)的防重復(fù)提交方式:

1:前端處理:

思路如下:

function dosubmit(){

//第一步,我們需要獲取表單的提交按鈕。

var btnSubmit = document.getElementById("submit");

//第二步,需要將表單提交按鈕設(shè)置為不可用(或則直接隱藏,但是隱藏的話會(huì)被認(rèn)為是BUG),這樣就可以避免用戶再次點(diǎn)擊提交按鈕,進(jìn)行提交操作。

btnSubmit.disabled= "disabled";

//第三步,返回true讓表單可以正常提交。

return true;

}

2:服務(wù)端session處理

思路如下:

1、在服務(wù)器端生成一個(gè)唯一的隨機(jī)標(biāo)識(shí)號(hào),專業(yè)術(shù)語稱為Token(令牌),并在當(dāng)前用戶的Session域中保存這個(gè)Token。

2、將Token發(fā)送到客戶端的Form表單中,在Form表單中使用隱藏域來存儲(chǔ)這個(gè)Token,表單提交的時(shí)候連同這個(gè)Token一起提交到服務(wù)器端。

3、在服務(wù)器端判斷客戶端提交上來的Token與服務(wù)器端生成的Token是否一致,如果不一致,那就是重復(fù)提交了,此時(shí)服務(wù)器端就可以不處理重復(fù)提交的表單。如果相同則處理表單提交,處理完后清除當(dāng)前用戶的Session域中存儲(chǔ)的標(biāo)識(shí)號(hào)。

防重復(fù)提交解決方案!史上最全原理解析!

 

Spring-AOP防重解決方案(推薦)

以上是比較早的防重復(fù)提交解決方案,本文我們再介紹一種:

服務(wù)端Spring -AOP防重

思路如下:

1、自定義注解 @NoRepeatSubmit 標(biāo)記有必要防重復(fù)提交請(qǐng)求Controller。

2、通過Spring-AOP方式對(duì)所有標(biāo)記了 @NoRepeatSubmit 的方法進(jìn)行切入攔截。

防重復(fù)提交解決方案!史上最全原理解析!

 

3、在業(yè)務(wù)方法執(zhí)行前,獲取當(dāng)前用戶的 token+ 當(dāng)前請(qǐng)求地址,作為一個(gè)唯一 KEY,去獲取 Redis 分布式鎖(如果此時(shí)并發(fā)獲取,只有一個(gè)線程會(huì)被成功獲取到鎖)。

防重復(fù)提交解決方案!史上最全原理解析!

 

4、業(yè)務(wù)方法執(zhí)行后,一定要釋放鎖,異常也要釋放鎖(放到finally中釋放亦可)。

防重復(fù)提交解決方案!史上最全原理解析!

 

通過上面測試,我們看到初始化十個(gè)線程,只有一個(gè)線程是提交成功了。


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

電子郵件地址不會(huì)被公開。 必填項(xiàng)已用*標(biāo)注

看不清?點(diǎn)擊更換