最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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)文章

  • springboot配置多數(shù)據(jù)源(靜態(tài)和動(dòng)態(tài)數(shù)據(jù)源)

    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
  • SpringBoot整合郵件發(fā)送的四種方法

    SpringBoot整合郵件發(fā)送的四種方法

    這篇文章主要介紹了SpringBoot整合郵件發(fā)送的四種方法,SpringBoot中集成了發(fā)送郵件的功能,本文做了進(jìn)一步優(yōu)化,需要的朋友可以參考下
    2023-03-03
  • Java實(shí)現(xiàn)網(wǎng)頁(yè)截屏功能及圖片下載功能的幾種方式

    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
  • iBatis習(xí)慣用的16條SQL語(yǔ)句

    iBatis習(xí)慣用的16條SQL語(yǔ)句

    iBatis 是apache 的一個(gè)開(kāi)源項(xiàng)目,一個(gè)O/R Mapping 解決方案,iBatis 最大的特點(diǎn)就是小巧,上手很快.這篇文章主要介紹了iBatis習(xí)慣用的16條SQL語(yǔ)句的相關(guān)資料,需要的朋友可以參考下
    2016-10-10
  • java查找無(wú)向連通圖中兩點(diǎn)間所有路徑的算法

    java查找無(wú)向連通圖中兩點(diǎn)間所有路徑的算法

    這篇文章主要介紹了java查找無(wú)向連通圖中兩點(diǎn)間所有路徑的算法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-01-01
  • java實(shí)現(xiàn)簡(jiǎn)單年齡計(jì)算器

    java實(shí)現(xiàn)簡(jiǎn)單年齡計(jì)算器

    這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)簡(jiǎn)單年齡計(jì)算器,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-05-05
  • win10安裝及配置Gradle全過(guò)程

    win10安裝及配置Gradle全過(guò)程

    本文詳細(xì)介紹了Gradle的下載、安裝、環(huán)境變量配置以及如何修改本地倉(cāng)庫(kù)位置,通過(guò)這些步驟,用戶可以成功安裝并配置Gradle,以便進(jìn)行項(xiàng)目構(gòu)建
    2025-11-11
  • 基于logback實(shí)現(xiàn)純java版本的SDK組件

    基于logback實(shí)現(xiàn)純java版本的SDK組件

    這篇文章主要介紹了基于logback實(shí)現(xiàn)純java版本的SDK組件,在項(xiàng)目開(kāi)發(fā)過(guò)程中通常會(huì)使用logback作為日志記錄的依賴工具,使用方式是引入logback相關(guān)jar包,然后配置logback.xml配置文件的方式來(lái)實(shí)現(xiàn),需要的朋友可以參考下
    2023-11-11
  • Java使用Tessdata做OCR圖片文字識(shí)別的詳細(xì)思路

    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接口實(shí)現(xiàn)示例詳解

    這篇文章主要為大家介紹了Java并發(fā)Lock接口,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-06-06

最新評(píng)論

黄冈市| 富平县| 苍山县| 华容县| 余干县| 陕西省| 大安市| 天柱县| 伊川县| 海兴县| 桂东县| 柳江县| 霍邱县| 石渠县| 高清| 蒙山县| 简阳市| 荔波县| 蓬溪县| 韶关市| 于田县| 鄂托克旗| 资中县| 广南县| 施甸县| 安陆市| 会东县| 阳新县| 大足县| 正安县| 兖州市| 新兴县| 松滋市| 乐亭县| 页游| 化州市| 理塘县| 长海县| 怀远县| 永吉县| 辽源市|