SpringBoot+Redis防止接口重復(fù)提交問題
前言
在項目的使用使用過程中,經(jīng)常會出現(xiàn)某些操作在短時間內(nèi)頻繁提交。
例如:用戶鼠標點擊過快而重復(fù)保存,從而創(chuàng)建了2筆一模一樣的單據(jù)。針對類似情況,我們就可以全局地控制接口不允許重復(fù)提交。
實現(xiàn)思路
- 創(chuàng)建攔截器 Interceptor,攔截所有API請求
- 將用戶唯一標識(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自定義注解,只有注解標識的接口才會重復(fù)判定
- 使用Session替代Redis進行存儲和校驗(不適用于tomcat集群)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
Java修改eclipse中web項目的server部署路徑問題
這篇文章主要介紹了Java修改eclipse中web項目的server部署路徑,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-11-11
Jmeter內(nèi)置變量vars和props的使用詳解
JMeter是一個功能強大的負載測試工具,它提供了許多有用的內(nèi)置變量來支持測試過程,其中最常用的變量是 vars 和 props,本文通過代碼示例詳細給大家介紹了Jmeter內(nèi)置變量vars和props的使用,需要的朋友可以參考下2024-08-08
Mybatis分頁插件PageHelper配置及使用方法詳解
這篇文章主要介紹了Mybatis分頁插件PageHelper配置及使用方法詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2020-08-08
SpringShell命令行之交互式Shell應(yīng)用開發(fā)方式
本文將深入探討Spring Shell的核心特性、實現(xiàn)方式及應(yīng)用場景,幫助開發(fā)者掌握這一強大工具,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2025-04-04
SpringMvc根據(jù)返回值類型不同處理響應(yīng)的方法
這篇文章主要介紹了SpringMvc根據(jù)返回值類型不同處理響應(yīng),我們可以通過控制器方法的返回值設(shè)置跳轉(zhuǎn)的視圖,控制器支持如void,String,ModelAndView類型,需要的朋友可以參考下2023-09-09

