欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java使用注解實(shí)現(xiàn)防止重復(fù)提交實(shí)例

 更新時(shí)間:2023年07月07日 08:28:06   作者:crazyK.  
這篇文章主要介紹了Java使用注解實(shí)現(xiàn)防止重復(fù)提交實(shí)例,在一些項(xiàng)目中由于用戶誤操作,多次點(diǎn)擊表單提交按鈕,會(huì)產(chǎn)生很多次的數(shù)據(jù)交互,為了解決這一問(wèn)題,本文使用注解來(lái)實(shí)現(xiàn)防止重復(fù)提交,需要的朋友可以參考下

重復(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)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評(píng)論