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

springboot防止表單重復(fù)提交方式

 更新時(shí)間:2025年12月11日 14:41:52   作者:svygh123  
本文介紹了兩種防止SpringBoot應(yīng)用中表單重復(fù)提交的方法:第一種是使用Redis來(lái)實(shí)現(xiàn),通過(guò)設(shè)置鍵值對(duì)和檢查唯一標(biāo)識(shí)來(lái)防止重復(fù)提交;第二種是使用SpringAOP,通過(guò)創(chuàng)建切面和自定義注解來(lái)統(tǒng)一處理防重復(fù)提交,減少重復(fù)代碼并保持業(yè)務(wù)邏輯清晰

第一種方法:?jiǎn)蝹€(gè)防止

在Spring Boot應(yīng)用中使用Redis來(lái)防止表單的重復(fù)提交,可以通過(guò)以下幾個(gè)步驟來(lái)實(shí)現(xiàn):

步驟 1:添加依賴

確保你的項(xiàng)目中添加了Spring Boot Starter Data Redis和Spring Boot Starter Web依賴。

pom.xml文件中添加以下依賴:

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-redis</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
</dependencies>

步驟 2:配置Redis

application.propertiesapplication.yml中配置Redis服務(wù)器的信息:

spring.redis.host=localhost
spring.redis.port=6379

步驟 3:創(chuàng)建一個(gè)工具類處理Redis操作

創(chuàng)建一個(gè)工具類來(lái)封裝Redis的一些常用操作,比如設(shè)置鍵值對(duì)、獲取鍵值對(duì)等。

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Component;

@Component
public class RedisUtil {

    @Autowired
    private StringRedisTemplate stringRedisTemplate;

    public void set(String key, String value) {
        stringRedisTemplate.opsForValue().set(key, value);
    }

    public String get(String key) {
        return stringRedisTemplate.opsForValue().get(key);
    }

    public void delete(String key) {
        stringRedisTemplate.delete(key);
    }
}

步驟 4:實(shí)現(xiàn)防重邏輯

在Controller中使用上面的工具類來(lái)實(shí)現(xiàn)防重邏輯。

通常的做法是在請(qǐng)求開(kāi)始時(shí)檢查Redis中是否存在該請(qǐng)求的唯一標(biāo)識(shí)(如用戶ID + 時(shí)間戳),如果不存在則允許請(qǐng)求繼續(xù),并將此標(biāo)識(shí)存入Redis;如果存在,則直接返回錯(cuò)誤信息。

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class MyController {

    @Autowired
    private RedisUtil redisUtil;

    @PostMapping("/submit")
    public String submit(@RequestParam("userId") String userId) {
        // 使用用戶ID和時(shí)間戳作為key,防止并發(fā)下的重復(fù)提交
        String key = "form_submit_" + userId + "_" + System.currentTimeMillis();

        if (redisUtil.get(key) != null) {
            return "請(qǐng)求重復(fù),請(qǐng)勿重復(fù)提交!";
        } else {
            // 執(zhí)行業(yè)務(wù)邏輯
            // ...

            // 將key存入Redis并設(shè)置過(guò)期時(shí)間
            redisUtil.set(key, "1", 5, TimeUnit.MINUTES);
            return "提交成功!";
        }
    }
}

請(qǐng)注意:

在實(shí)際應(yīng)用中,你可能需要根據(jù)具體需求調(diào)整上述代碼,比如更改存儲(chǔ)在Redis中的鍵的生成方式、設(shè)置更合理的過(guò)期時(shí)間等。

此外,為了提高性能和避免并發(fā)問(wèn)題,可以考慮使用Redis的原子操作,例如SETNX命令。

第二種方法:aop全局方法

使用AOP(面向切面編程)來(lái)統(tǒng)一處理防重復(fù)提交是一種很好的實(shí)踐,它能減少重復(fù)代碼并保持業(yè)務(wù)邏輯的清晰性。下面是如何使用Spring AOP來(lái)實(shí)現(xiàn)這一功能的示例。

首先,你需要在項(xiàng)目中添加Spring AOP的支持,通常情況下Spring Boot項(xiàng)目已經(jīng)默認(rèn)包含AOP支持。

步驟 1:創(chuàng)建切面類

創(chuàng)建一個(gè)切面類,用于定義防重提交的邏輯。

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Component;

import java.util.concurrent.TimeUnit;

@Aspect
@Component
public class AntiDuplicateSubmissionAspect {

    private static final String KEY_PREFIX = "anti_duplicate_";

    @Autowired
    private StringRedisTemplate stringRedisTemplate;

    @Around("@annotation(antiDuplicateSubmission)")
    public Object antiDuplicateSubmit(ProceedingJoinPoint joinPoint, AntiDuplicateSubmission antiDuplicateSubmission) throws Throwable {
        // 從注解中獲取參數(shù)名
        String paramName = antiDuplicateSubmission.value();
        // 獲取方法參數(shù)
        Object[] args = joinPoint.getArgs();
        // 假設(shè)參數(shù)位置已知,或者通過(guò)參數(shù)名獲取參數(shù)值
        String userId = (String) args[0];

        // 生成唯一標(biāo)識(shí)符
        String key = KEY_PREFIX + userId + "_" + System.currentTimeMillis();

        // 檢查是否已經(jīng)存在
        if (stringRedisTemplate.hasKey(key)) {
            throw new RuntimeException("請(qǐng)求重復(fù),請(qǐng)勿重復(fù)提交!");
        }

        // 設(shè)置過(guò)期時(shí)間,例如5分鐘
        stringRedisTemplate.opsForValue().set(key, "1", 5, TimeUnit.MINUTES);

        try {
            return joinPoint.proceed();
        } finally {
            // 清理key,這一步在大多數(shù)情況下可選,因?yàn)樵O(shè)置了過(guò)期時(shí)間
            stringRedisTemplate.delete(key);
        }
    }
}

步驟 2:創(chuàng)建自定義注解

創(chuàng)建一個(gè)自定義注解,用于標(biāo)記需要防重提交的控制器方法。

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface AntiDuplicateSubmission {
    String value();
}

步驟 3:應(yīng)用注解

在需要防重提交的Controller方法上應(yīng)用這個(gè)注解。

import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class MyController {

    @PostMapping("/submit")
    @AntiDuplicateSubmission(value = "userId")
    public String submit(@RequestParam("userId") String userId) {
        // 執(zhí)行業(yè)務(wù)邏輯
        // ...
        return "提交成功!";
    }
}

這樣,每次有請(qǐng)求到達(dá)帶有@AntiDuplicateSubmission注解的方法時(shí),AOP切面會(huì)先執(zhí)行防重檢查,如果發(fā)現(xiàn)重復(fù)提交,則阻止業(yè)務(wù)邏輯執(zhí)行并拋出異常。

注意:

這里的AntiDuplicateSubmission注解的value屬性應(yīng)該與請(qǐng)求參數(shù)名匹配,以便正確地獲取到用戶ID或其他用于生成唯一標(biāo)識(shí)符的參數(shù)。

同時(shí),使用System.currentTimeMillis()生成的時(shí)間戳作為一部分唯一標(biāo)識(shí)符可能在高并發(fā)場(chǎng)景下存在并發(fā)問(wèn)題,你可能需要一個(gè)更安全的唯一生成策略,例如UUID或者結(jié)合用戶ID、請(qǐng)求時(shí)間以及隨機(jī)數(shù)等生成一個(gè)更復(fù)雜的唯一標(biāo)識(shí)符。

總結(jié)

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • Spring Boot 集成 ElasticSearch應(yīng)用小結(jié)

    Spring Boot 集成 ElasticSearch應(yīng)用小結(jié)

    這篇文章主要介紹了Spring Boot 集成 ElasticSearch應(yīng)用小結(jié),本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-11-11
  • Java中死鎖的原理實(shí)戰(zhàn)分析

    Java中死鎖的原理實(shí)戰(zhàn)分析

    這篇文章主要介紹了Java中死鎖的原理,結(jié)合具體案例形式分析了java死鎖形成的相關(guān)原理,需要的朋友可以參考下
    2019-08-08
  • IDEA新建springboot項(xiàng)目時(shí)未生成pom.xml文件的解決操作

    IDEA新建springboot項(xiàng)目時(shí)未生成pom.xml文件的解決操作

    這篇文章主要給大家介紹了關(guān)于IDEA新建springboot項(xiàng)目時(shí)未生成pom.xml文件的解決操作方法,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2023-02-02
  • Java Web stmp發(fā)送帶附件郵件(附SSL版)

    Java Web stmp發(fā)送帶附件郵件(附SSL版)

    這篇文章主要為大家詳細(xì)介紹了Java Web stmp發(fā)送帶附件郵件,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-05-05
  • java Signleton模式詳解及示例代碼

    java Signleton模式詳解及示例代碼

    Singleton模式是創(chuàng)建模式。這種模式只涉及一個(gè)類是負(fù)責(zé)創(chuàng)建自己的對(duì)象。該類確保只有一個(gè)對(duì)象獲得創(chuàng)建。這個(gè)類提供了一種方法來(lái)訪問(wèn)它的唯一對(duì)象
    2016-10-10
  • MyBatis-Plus updateById方法更新不了空字符串/null的問(wèn)題及解決

    MyBatis-Plus updateById方法更新不了空字符串/null的問(wèn)題及解決

    MyBatis-Plus的updateById()方法在更新字段為null時(shí)會(huì)失敗,因?yàn)槟J(rèn)策略不更新null值,文章提供三種解決方案:全局配置忽略判斷、使用PO對(duì)象的el屬性指定jdbcType、通過(guò)注解設(shè)置字段驗(yàn)證策略為IGNORED
    2026-03-03
  • java實(shí)現(xiàn)畫(huà)圖板上畫(huà)一條直線

    java實(shí)現(xiàn)畫(huà)圖板上畫(huà)一條直線

    這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)畫(huà)圖板上畫(huà)一條直線,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-08-08
  • java一個(gè)接口多個(gè)實(shí)現(xiàn)類的調(diào)用方式

    java一個(gè)接口多個(gè)實(shí)現(xiàn)類的調(diào)用方式

    這篇文章主要給大家介紹了關(guān)于java一個(gè)接口多個(gè)實(shí)現(xiàn)類的調(diào)用方式的相關(guān)資料,經(jīng)測(cè)試確認(rèn),當(dāng)一個(gè)接口有多個(gè)實(shí)現(xiàn)時(shí),調(diào)用時(shí)只會(huì)執(zhí)行一個(gè),有時(shí)候需要多個(gè)實(shí)現(xiàn)調(diào)用,需要的朋友可以參考下
    2023-09-09
  • Java如何獲取指定目錄文件列表

    Java如何獲取指定目錄文件列表

    這篇文章主要介紹了Java如何獲取指定目錄文件列表,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-08-08
  • RabbitMQ冪等性與優(yōu)先級(jí)及惰性詳細(xì)全面講解

    RabbitMQ冪等性與優(yōu)先級(jí)及惰性詳細(xì)全面講解

    關(guān)于MQ消費(fèi)者的冪等性問(wèn)題,在于MQ的重試機(jī)制,因?yàn)榫W(wǎng)絡(luò)原因或客戶端延遲消費(fèi)導(dǎo)致重復(fù)消費(fèi)。使用MQ重試機(jī)制需要注意的事項(xiàng)以及如何解決消費(fèi)者冪等性與優(yōu)先級(jí)及惰性問(wèn)題以下將逐一講解
    2022-11-11

最新評(píng)論

仪陇县| 佳木斯市| 华蓥市| 江源县| 秦皇岛市| 巴东县| 长岛县| 广饶县| 册亨县| 阳谷县| 沙河市| 宁南县| 菏泽市| 交城县| 泸州市| 沾化县| 莎车县| 仙游县| 自治县| 溧阳市| 乐昌市| 中超| 仙游县| 盐源县| 察哈| 普格县| 泾川县| 侯马市| 宝丰县| 崇礼县| 新田县| 苗栗市| 兴安盟| 尤溪县| 安阳县| 洛宁县| 博湖县| 科技| 公主岭市| 双峰县| 团风县|