首先聲明此方案與并發(fā)沒有關(guān)系,所以下文或者截圖中涉及到的并發(fā)一詞都是不合理的
這種控制其實(shí)不嚴(yán)格,比如針對多臺服務(wù)器就不是你想的那樣
此方案是用來限制接口訪問的數(shù),只是處于保護(hù)服務(wù)器,減少數(shù)據(jù)庫壓力
背景:項(xiàng)目中有一個按二級大類批量更改配置的操作,但是還不能直接以update的形式進(jìn)行更改,必須先假刪除,再insert,并且在刪除之前有一個select,對查出來的數(shù)據(jù)進(jìn)行遍歷。
導(dǎo)致的問題:事務(wù)時間長,會出現(xiàn)dubbo超時,導(dǎo)致數(shù)據(jù)庫完成更新,前端顯示系統(tǒng)異常,給用戶一個操作失敗的錯覺
解決方案:異步操作數(shù)據(jù)庫,直接給前端返回,以犧牲結(jié)果正確性保證,來換取一個友好的交互。
此方案還是有一個問題,當(dāng)數(shù)據(jù)庫還未更新完成時,用戶查詢時查不到最新修改的,導(dǎo)致用戶以為更新失敗再次更改,無形中增加了不必要的重復(fù)更新操作
解決方案:給哪些有上述問題的接口添加一個訪問次數(shù)限制控制,比如此接口一分鐘之內(nèi)只允許更改一次,此方案并不能保證用戶的每一次操作,數(shù)據(jù)庫都會成功更新,只是對這種批量的操作設(shè)置得更人性化一點(diǎn),只是在保護(hù)服務(wù)器
以下給出代碼:
一:基礎(chǔ)類的創(chuàng)建
1、創(chuàng)建使用在Controller類上的注解

2、創(chuàng)建使用在方法上的注解(前提是該方法所在的類使用了步驟一中的注解)

3、創(chuàng)建每個控制點(diǎn)的實(shí)體類(紅框部分大家可以思考一下為什么要重寫)

4、創(chuàng)建一個被禁止訪問的一個友好提示,這里建了一個實(shí)體類

以上完成了一些基本的類和注解的創(chuàng)建,接下來就是如何去實(shí)現(xiàn)了
二、業(yè)務(wù)實(shí)現(xiàn)
1、思路分析,既然是對每個接口的訪問,那我們就要考慮如何把控制權(quán)放在接口的上層(具體哪一層可以根據(jù)項(xiàng)目擇優(yōu)選擇),因?yàn)閏ontroller的上層肯定知道本次請求要訪問哪個handler(既,哪個接口),我在項(xiàng)目中把控制權(quán)放在了攔截器層面
2、以下列出我的業(yè)務(wù)實(shí)現(xiàn)
攔截器的實(shí)現(xiàn),方法里第一步可以先判斷一下map的長度是否大于零,你懂的,這里就不改了

setApplicationContext方法的實(shí)現(xiàn)

攔截器工具類的方法有兩個


最后配置一下攔截器到配置文件里,? <mvc:interceptors></mvc:interceptors>里可以配置多個攔截器
注意事項(xiàng):
1、控制點(diǎn)事控制接口的訪問的,不是控制按鈕點(diǎn)擊的,所以要注意一些情況,比如:你對一個修改和一個查詢做了并發(fā)控制,但是通常修改完后會自定調(diào)取查詢接口,所以要注意隱藏的一些調(diào)用
2、注意攔截器的執(zhí)行順序