SpringBoot+Redis防止接口重復(fù)提交問(wèn)題
前言
在項(xiàng)目的使用使用過(guò)程中,經(jīng)常會(huì)出現(xiàn)某些操作在短時(shí)間內(nèi)頻繁提交。
例如:用戶鼠標(biāo)點(diǎn)擊過(guò)快而重復(fù)保存,從而創(chuàng)建了2筆一模一樣的單據(jù)。針對(duì)類似情況,我們就可以全局地控制接口不允許重復(fù)提交。
實(shí)現(xiàn)思路
- 創(chuàng)建攔截器 Interceptor,攔截所有API請(qǐng)求
- 將用戶唯一標(biāo)識(shí)(token或者jsessionid)+接口地址進(jìn)行拼接,作為后續(xù)步驟的 redis-key
- 判斷Redis是否存在該key值,存在說(shuō)明重復(fù)提交,不存在就存入Redis,過(guò)期時(shí)間1秒

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

總結(jié)
這邊只是提供一種簡(jiǎn)單的方案,還可以有其他擴(kuò)展,例如:
- 增加參數(shù)的校驗(yàn),只做相同參數(shù)的重復(fù)判定,參數(shù)不同可以重復(fù)提交
- 增加AOP自定義注解,只有注解標(biāo)識(shí)的接口才會(huì)重復(fù)判定
- 使用Session替代Redis進(jìn)行存儲(chǔ)和校驗(yàn)(不適用于tomcat集群)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Java實(shí)現(xiàn)添加文字水印&圖片水印的方法詳解
為圖片添加水印的主要作用是保護(hù)圖片版權(quán),防止圖片被未經(jīng)授權(quán)的人使用或傳播。本文為大家介紹了Java實(shí)現(xiàn)添加文字水印&圖片水印的具體方法,需要的可以參考一下2023-02-02
Java修改eclipse中web項(xiàng)目的server部署路徑問(wèn)題
這篇文章主要介紹了Java修改eclipse中web項(xiàng)目的server部署路徑,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-11-11
Jmeter內(nèi)置變量vars和props的使用詳解
JMeter是一個(gè)功能強(qiáng)大的負(fù)載測(cè)試工具,它提供了許多有用的內(nèi)置變量來(lái)支持測(cè)試過(guò)程,其中最常用的變量是 vars 和 props,本文通過(guò)代碼示例詳細(xì)給大家介紹了Jmeter內(nèi)置變量vars和props的使用,需要的朋友可以參考下2024-08-08
Mybatis分頁(yè)插件PageHelper配置及使用方法詳解
這篇文章主要介紹了Mybatis分頁(yè)插件PageHelper配置及使用方法詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-08-08
很簡(jiǎn)單的Java斷點(diǎn)續(xù)傳實(shí)現(xiàn)原理
這篇文章主要以實(shí)例的方式為大家詳細(xì)介紹了簡(jiǎn)單的Java斷點(diǎn)續(xù)傳實(shí)現(xiàn)原理,感興趣的小伙伴們可以參考一下2016-07-07
SpringShell命令行之交互式Shell應(yīng)用開發(fā)方式
本文將深入探討Spring Shell的核心特性、實(shí)現(xiàn)方式及應(yīng)用場(chǎng)景,幫助開發(fā)者掌握這一強(qiáng)大工具,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2025-04-04
Struts2實(shí)現(xiàn)文件上傳時(shí)顯示進(jìn)度條功能
這篇文章主要為大家詳細(xì)介紹了Struts2實(shí)現(xiàn)文件上傳時(shí)顯示進(jìn)度條功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-05-05
SpringMvc根據(jù)返回值類型不同處理響應(yīng)的方法
這篇文章主要介紹了SpringMvc根據(jù)返回值類型不同處理響應(yīng),我們可以通過(guò)控制器方法的返回值設(shè)置跳轉(zhuǎn)的視圖,控制器支持如void,String,ModelAndView類型,需要的朋友可以參考下2023-09-09

