SpringBoot+Redis防止接口重復(fù)提交問題
更新時間:2025年06月20日 11:25:49 作者:°Fuhb
這篇文章主要介紹了SpringBoot+Redis防止接口重復(fù)提交問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
前言
在項目的使用使用過程中,經(jīng)常會出現(xiàn)某些操作在短時間內(nèi)頻繁提交。
例如:用戶鼠標(biāo)點擊過快而重復(fù)保存,從而創(chuàng)建了2筆一模一樣的單據(jù)。針對類似情況,我們就可以全局地控制接口不允許重復(fù)提交。
實現(xiàn)思路
- 創(chuàng)建攔截器 Interceptor,攔截所有API請求
- 將用戶唯一標(biāo)識(token或者jsessionid)+接口地址進行拼接,作為后續(xù)步驟的 redis-key
- 判斷Redis是否存在該key值,存在說明重復(fù)提交,不存在就存入Redis,過期時間1秒

代碼示例
- 創(chuàng)建攔截器 RepeatSubmitInterceptor
@Component
public class RepeatSubmitInterceptor extends HandlerInterceptorAdapter {
@Autowired
private StringRedisTemplate stringRedisTemplate;
//防重時間間隔(秒)
private final int duration = 1;
@Override
public 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("請勿重復(fù)提交");
}
return true;
}
}
- 注入攔截器
@Configuration
public class MvcConfig implements WebMvcConfigurer {
@Autowired
private RepeatSubmitInterceptor repeatSubmitInterceptor;
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(repeatSubmitInterceptor);
}
}測試
建個 controller 并創(chuàng)建個簡單的測試接口,打開 postman 快速點擊2次請求,結(jié)果如下:

總結(jié)
這邊只是提供一種簡單的方案,還可以有其他擴展,例如:
- 增加參數(shù)的校驗,只做相同參數(shù)的重復(fù)判定,參數(shù)不同可以重復(fù)提交
- 增加AOP自定義注解,只有注解標(biāo)識的接口才會重復(fù)判定
- 使用Session替代Redis進行存儲和校驗(不適用于tomcat集群)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
Java調(diào)用bat執(zhí)行python腳本方式
文章介紹了如何在Windows環(huán)境下通過Java調(diào)用bat文件來執(zhí)行Python腳本,并解決了執(zhí)行過程中出現(xiàn)的中文亂碼問題,具體方法是修改bat文件的編碼格式為ANSI,這樣可以確保中文路徑不會因編碼問題而導(dǎo)致路徑錯誤2025-10-10
SpringBoot 文件或圖片上傳與下載功能的實現(xiàn)
這篇文章主要介紹了SpringBoot 文件或圖片上傳與下載功能的實現(xiàn),本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-02-02
dubbo集成zipkin獲取Traceid的實現(xiàn)
這篇文章主要介紹了dubbo集成zipkin獲取Traceid的實現(xiàn)方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-07-07

