Java使用注解實(shí)現(xiàn)防止重復(fù)提交實(shí)例
重復(fù)提交的場(chǎng)景:
- 用于用戶誤操作,多次點(diǎn)擊表單提交按鈕
- 由于網(wǎng)速等原因造成頁(yè)面卡頓,用戶重復(fù)刷新提交頁(yè)面
- 惡用戶如利用postman等工具重復(fù)惡意提交表單
為了防止以上情況的出現(xiàn)需要自定義一個(gè)注解來(lái)完成防止重復(fù)提交操作
實(shí)現(xiàn)
1.創(chuàng)建一個(gè)注解
/**
* 自定義注解防止表單重復(fù)提交
*/
@Documented
@Target({ElementType.TYPE,ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface NoRepeatSubmit {
int lockTime() default 5;
}注解參數(shù)不懂的小伙伴可以移步這篇文章:java自定義注解_crazyK.的博客-CSDN博客
2.創(chuàng)建Http請(qǐng)求工具類(lèi),用于在切面時(shí)獲取token使用
public class HttpContextUtils {
public static HttpServletRequest httpServletRequest(){
return ((ServletRequestAttributes) Objects.requireNonNull(RequestContextHolder.getRequestAttributes())).getRequest();
}
}3.項(xiàng)目中加入SpringAop依賴(lài)
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>4.創(chuàng)建切面
將切點(diǎn)注冊(cè)為自定義的注解,唯一表示采用接口url+token的形式,戶每發(fā)起第一次添加請(qǐng)求,會(huì)經(jīng)過(guò)界面,在切面獲取信息后組裝起來(lái)存入Redis,當(dāng)用戶后續(xù)發(fā)起請(qǐng)求時(shí),首先判斷Redis中是否緩存了這個(gè)key,如果緩存了,則證明已經(jīng)提交,于是反饋給前端,如果不存在,證明沒(méi)有提交,則存入Redis。
@Component
@Aspect
public class NoRepeatSubmitAspect {
@Autowired
private RedisTemplate<String,Object> redisTemplate;
@Pointcut("@annotation(repeatSubmit)")
public void pointcutNoRepeat(NoRepeatSubmit repeatSubmit){};
@Around("pointcutNoRepeat(noRepeatSubmit)")
public Object doNoRepeat(ProceedingJoinPoint point, NoRepeatSubmit noRepeatSubmit) throws Throwable {
int i=noRepeatSubmit.lockTime();
HttpServletRequest httpServletRequest = HttpContextUtils.httpServletRequest();
String token = httpServletRequest.getHeader("token");
String url = httpServletRequest.getRequestURL().toString();
String sign = url+"/"+token;
Boolean key=redisTemplate.hasKey(sign);
if (key){
throw new Exception("請(qǐng)勿重復(fù)提交");
}
redisTemplate.opsForValue().set(sign,sign,i, TimeUnit.SECONDS);
return point.proceed();
}
}測(cè)試
將我們自定義的注解加到對(duì)應(yīng)方法上

先向redis中插入一條key為crazyk,value為csdn的數(shù)據(jù)


提交成功,然后在向redis中存入相同的數(shù)據(jù)后端會(huì)拋出我們?cè)谇忻孀远x的異常

到此這篇關(guān)于Java使用注解實(shí)現(xiàn)防止重復(fù)提交實(shí)例的文章就介紹到這了,更多相關(guān)Java注解防止重復(fù)提交內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- java如何防止表單重復(fù)提交的注解@RepeatSubmit
- java后端如何實(shí)現(xiàn)防止接口重復(fù)提交
- java后臺(tái)防止表單重復(fù)提交方法詳解
- java開(kāi)發(fā)中防止重復(fù)提交的幾種解決方案
- Java防止頻繁請(qǐng)求、重復(fù)提交的操作代碼(后端防抖操作)
- Java后端限制頻繁請(qǐng)求和重復(fù)提交的實(shí)現(xiàn)
- Java中防止數(shù)據(jù)重復(fù)提交超簡(jiǎn)單的6種方法
- Java結(jié)合redis實(shí)現(xiàn)接口防重復(fù)提交
- Java表單重復(fù)提交的避免方法
- JAVA防止重復(fù)提交Web表單的方法
- Java防止重復(fù)提交訂單的實(shí)現(xiàn)示例
相關(guān)文章
springboot配置多數(shù)據(jù)源(靜態(tài)和動(dòng)態(tài)數(shù)據(jù)源)
在開(kāi)發(fā)過(guò)程中,很多時(shí)候都會(huì)有垮數(shù)據(jù)庫(kù)操作數(shù)據(jù)的情況,需要同時(shí)配置多套數(shù)據(jù)源,本文主要介紹了springboot配置多數(shù)據(jù)源(靜態(tài)和動(dòng)態(tài)數(shù)據(jù)源),感興趣的可以了解一下2023-09-09
Java實(shí)現(xiàn)網(wǎng)頁(yè)截屏功能及圖片下載功能的幾種方式
在現(xiàn)代Web開(kāi)發(fā)中,有時(shí)我們需要對(duì)特定的網(wǎng)頁(yè)進(jìn)行截屏或者從網(wǎng)頁(yè)中下載圖片,本文將介紹如何使用Java實(shí)現(xiàn)這兩種功能,我們將探討幾種不同的方法,包括使用Selenium?WebDriver、Jsoup和Apache?HttpClient等工具,需要的朋友可以參考下2025-08-08
java查找無(wú)向連通圖中兩點(diǎn)間所有路徑的算法
這篇文章主要介紹了java查找無(wú)向連通圖中兩點(diǎn)間所有路徑的算法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-01-01
java實(shí)現(xiàn)簡(jiǎn)單年齡計(jì)算器
這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)簡(jiǎn)單年齡計(jì)算器,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-05-05
基于logback實(shí)現(xiàn)純java版本的SDK組件
這篇文章主要介紹了基于logback實(shí)現(xiàn)純java版本的SDK組件,在項(xiàng)目開(kāi)發(fā)過(guò)程中通常會(huì)使用logback作為日志記錄的依賴(lài)工具,使用方式是引入logback相關(guān)jar包,然后配置logback.xml配置文件的方式來(lái)實(shí)現(xiàn),需要的朋友可以參考下2023-11-11
Java使用Tessdata做OCR圖片文字識(shí)別的詳細(xì)思路
這篇文章主要介紹了Java使用Tessdata做OCR圖片文字識(shí)別的詳細(xì)思路,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-07-07
Java并發(fā)Lock接口實(shí)現(xiàn)示例詳解
這篇文章主要為大家介紹了Java并發(fā)Lock接口,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-06-06

