日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

SpringBoot+Redis防止接口重复提交

發布時間:2025/3/19 javascript 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 SpringBoot+Redis防止接口重复提交 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

前言

在項目的使用使用過程中,經常會出現某些操作在短時間內頻繁提交。例如:用戶鼠標點擊過快而重復保存,從而創建了2筆一模一樣的單據。針對類似情況,我們就可以全局地控制接口不允許重復提交。

實現思路

  • 創建攔截器 Interceptor,攔截所有API請求
  • 將用戶唯一標識(token或者jsessionid)+接口地址進行拼接,作為后續步驟的 redis-key
  • 判斷Redis是否存在該key值,存在說明重復提交,不存在就存入Redis,過期時間1秒

代碼示例

創建攔截器 RepeatSubmitInterceptor

@Component public class RepeatSubmitInterceptor extends HandlerInterceptorAdapter {@Autowiredprivate StringRedisTemplate stringRedisTemplate;//防重時間間隔(秒)private final int duration = 1;@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {if (request.getDispatcherType() == DispatcherType.ERROR){return true;}String token = request.getHeader("token");String lockKey = "RepeatSubmit:" + token + ":" + request.getServletPath();Boolean result = stringRedisTemplate.opsForValue().setIfAbsent(lockKey, "", duration, TimeUnit.SECONDS);if (!result){throw new Exception("請勿重復提交");}return true;} }

注入攔截器

@Configuration public class MvcConfig implements WebMvcConfigurer {@Autowiredprivate RepeatSubmitInterceptor repeatSubmitInterceptor;@Overridepublic void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(repeatSubmitInterceptor);} }

測試

建個 controller 并創建個簡單的測試接口,打開 postman 快速點擊2次請求,結果如下:

總結

這邊只是提供一種簡單的方案,還可以有其他擴展,例如:

  • 增加參數的校驗,只做相同參數的重復判定,參數不同可以重復提交
  • 增加AOP自定義注解,只有注解標識的接口才會重復判定
  • 使用Session替代Redis進行存儲和校驗(不適用于tomcat集群)

總結

以上是生活随笔為你收集整理的SpringBoot+Redis防止接口重复提交的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。