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)求工具類,用于在切面時(shí)獲取token使用
public class HttpContextUtils {
public static HttpServletRequest httpServletRequest(){
return ((ServletRequestAttributes) Objects.requireNonNull(RequestContextHolder.getRequestAttributes())).getRequest();
}
}3.項(xiàng)目中加入SpringAop依賴
<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)文章
Spring?AOP操作的相關(guān)術(shù)語(yǔ)及環(huán)境準(zhǔn)備
這篇文章主要為大家介紹了Spring?AOP操作的相關(guān)術(shù)語(yǔ)及環(huán)境準(zhǔn)備學(xué)習(xí),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-05-05
Spring Boot 2.5.0 重新設(shè)計(jì)的spring.sql.init 配置有啥用
前幾天Spring Boot 2.5.0發(fā)布了,其中提到了關(guān)于Datasource初始化機(jī)制的調(diào)整,有讀者私信想了解這方面做了什么調(diào)整。那么今天就要詳細(xì)說(shuō)說(shuō)這個(gè)重新設(shè)計(jì)的配置內(nèi)容,并結(jié)合實(shí)際情況說(shuō)說(shuō)我的理解和實(shí)踐建議2021-05-05
Java查找不重復(fù)無(wú)序數(shù)組中是否存在兩個(gè)數(shù)字的和為某個(gè)值
今天小編就為大家分享一篇關(guān)于Java查找不重復(fù)無(wú)序數(shù)組中是否存在兩個(gè)數(shù)字的和為某個(gè)值,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧2019-01-01
java實(shí)現(xiàn)人民幣大小寫轉(zhuǎn)換方法分享
本文介紹java人民幣數(shù)字大小寫轉(zhuǎn)換方法,代碼中有注釋,大家直接看代碼吧2014-01-01
Mybatis配置錯(cuò)誤:java.lang.ExceptionInInitializerError
這篇文章主要介紹了Mybatis配置錯(cuò)誤:java.lang.ExceptionInInitializerError的相關(guān)資料,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-12-12
IDEA配置和啟動(dòng)maven項(xiàng)目詳細(xì)步驟
本文介紹了從SVN檢出Web項(xiàng)目并進(jìn)行Maven化、JDK和項(xiàng)目結(jié)構(gòu)配置、Spring和Tomcat環(huán)境搭建的詳細(xì)步驟,幫助讀者順利完成Java Web項(xiàng)目的開(kāi)發(fā)環(huán)境搭建2025-10-10
快速掌握SpringBoot應(yīng)用的啟動(dòng)入口
本篇并不是深究?jī)?nèi)置服務(wù)器的啟動(dòng)過(guò)程,而是追溯Springboot啟動(dòng)之前到底做了什么?它是如何與我們經(jīng)常寫的@SpringBootApplication注解注釋的main方法類綁定起來(lái)的?對(duì)SpringBoot啟動(dòng)入口相關(guān)知識(shí)感興趣的朋友一起看看吧2022-05-05
為什么SpringMVC中請(qǐng)求的body不支持多次讀取
這篇文章主要介紹了為什么SpringMVC中請(qǐng)求的body不支持多次讀取,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-12-12

