大批量重複提交的解決方案

冪等概念:任意多次執行所產生的影響均與一次執行的影響相同。即,對數據庫的影響只能是一次性的。

應用場景:同一時刻大量的重複的請求提交,需過濾掉重複請求,避免對業務數據的影響。

思路:token機制

實現工具:SpringBoot+Redis

具體實現:

1、springboot中有封裝好的redisTemplate,可以寫緩存,讀緩存,刪緩存,設置緩存有效期和判斷緩存值,搭建好redis服務。

2、實現自定義註解AutoIdempotent,

@Target({ElementType.METHOD})

@Retention(RetentionPolicy.RUNTIME)

public@interfaceAutoIdempotent{

}

目的是爲了,把它添加在需要實現冪等的方法上,凡是某個方法註解了它,都會實現自動冪等,註解ElementType.METHOD表示它只能放在方法上,etentionPolicy.RUNTIME表示它在運行時

3、token服務接口

創建token服務,裏面主要是兩個方法,一個用來創建token,一個用來驗證token。創建token主要產生的是一個字符串,檢驗token的話主要是傳達request對象,獲取header裏面的token,然後檢驗,通過拋出的Exception來獲取具體的報錯信息返回給前端。

4、token的服務實現類

token引用了redis服務,創建token採用隨機算法工具類生成隨機uuid字符串,然後放入到redis中,如果放入成功,最後返回這個token值。checkToken方法就是從header中獲取token到值(如果header中拿不到,就從paramter中獲取),如若不存在,直接拋出異常。這個異常信息可以被攔截器捕捉到,然後返回給前端。

5、配置攔截器

web配置類,實現WebMvcConfigurerAdapter,主要作用就是添加autoIdempotentInterceptor到配置類中,這樣我們到攔截器才能生效,注意使用@Configuration註解,這樣在容器啓動是時候就可以添加進入context中。

6、攔截處理器:主要的功能是攔截掃描到AutoIdempotent到註解到方法,然後調用tokenService的checkToken()方法校驗token是否正確,如果捕捉到異常就將異常信息渲染成json返回給前端

7、首先我們需要通過/get/token路徑通過getToken()方法去獲取具體的token,然後我們調用testIdempotence方法,這個方法上面註解了@AutoIdempotent,攔截器會攔截所有的請求,當判斷到處理的方法上面有該註解的時候,就會調用TokenService中的checkToken()方法,如果捕獲到異常會將異常拋出調用者

8、

使用postman請求

首先訪問get/token路徑獲取到具體到token,利用獲取到到token,然後放到具體請求到header中,可以看到第一次請求成功,接着我們請求第二次,第二次請求,返回到是重複性操作,可見重複性驗證通過,再多次請求到時候我們只讓其第一次成功,第二次就是失敗。

以上爲java思維導圖中https://mp.weixin.qq.com/s?__biz=MzI4OTA3NDQ0Nw==&mid=2455547698&idx=1&sn=48344bc7e45d98e3be947148f1011880&chksm=fb9cb352cceb3a440948666cec89a29f43cc951bf5d0d1679f801dcd5423ed888f0609b270df&mpshare=1&scene=1&srcid=0402UvOUpzVUe916d12BXAc6&sharer_sharetime=1585786176696&sharer_shareid=99b85a1adcc35cc9f798d00e1c679fd6&exportkey=AYIUtUBgYGD4asujhduaysE%3D&pass_ticket=jjcT1tv4wV9qSWWwHdMWLhjOcP1Ug622tISTneVsF27RP6RHgafuAz7tslRlDsa%2F#rd的整理。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章