精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

有效防止重復提交的六個方法

開發 前端
重復提交是開發中經常遇到的問題。用戶可能因為頁面響應慢連續點擊提交按鈕,或者網絡延遲時反復重試。這些情況會導致數據重復、業務混亂,比如生成重復訂單、多次扣款等問題。最重要的是,不要完全依賴前端的防護,后端必須要有相應的驗證機制。這樣才能確保系統的數據安全和業務穩定。

重復提交是開發中經常遇到的問題。用戶可能因為頁面響應慢連續點擊提交按鈕,或者網絡延遲時反復重試。這些情況會導致數據重復、業務混亂,比如生成重復訂單、多次扣款等問題。

防止重復提交需要前后端配合。前端主要提升用戶體驗,后端才是真正的保障。

前端防止重復提交

前端方法能防止用戶誤操作,但不能完全依賴,因為可以通過工具繞過前端驗證。

1. 按鈕禁用

提交后立即禁用按鈕,這是最直接的方法。

functionsubmitForm() {
const btn = document.getElementById('submitBtn');

// 如果按鈕已禁用,直接返回
if (btn.disabled) return;

// 禁用按鈕并改變文字
    btn.disabled = true;
    btn.textContent = '提交中...';

// 發送請求
    fetch('/api/submit', {
method: 'POST',
body: JSON.stringify(formData)
    })
    .then(response => response.json())
    .then(data => {
// 處理響應
    })
    .catch(error => {
console.error('Error:', error);
    })
    .finally(() => {
// 無論成功失敗,都重新啟用按鈕
        btn.disabled = false;
        btn.textContent = '提交';
    });
}

2. 防抖函數

控制按鈕在指定時間內只能點擊一次。

functiondebounce(func, wait) {
let timeout;
returnfunction() {
const context = this;
const args = arguments;

clearTimeout(timeout);
        timeout = setTimeout(() => {
            func.apply(context, args);
        }, wait);
    };
}

// 使用示例
const submitForm = debounce(function() {
// 實際的提交邏輯
}, 1000); // 1秒內只能點擊一次

3. 請求攔截

記錄正在處理的請求,發現重復請求直接攔截。

classRequestManager{
constructor() {
this.pendingRequests = newMap();
    }

    generateKey(config) {
return`${config.method}-${config.url}-${JSON.stringify(config.data)}`;
    }

    addRequest(config) {
const key = this.generateKey(config);
if (this.pendingRequests.has(key)) {
returnfalse;
        }
this.pendingRequests.set(key, true);
returntrue;
    }

    removeRequest(config) {
const key = this.generateKey(config);
this.pendingRequests.delete(key);
    }
}

// 在axios攔截器中使用
const requestManager = new RequestManager();

axios.interceptors.request.use(config => {
if (!requestManager.addRequest(config)) {
returnPromise.reject(newError('請求已處理中'));
    }
return config;
});

axios.interceptors.response.use(response => {
    requestManager.removeRequest(response.config);
return response;
}, error => {
if (error.config) {
        requestManager.removeRequest(error.config);
    }
returnPromise.reject(error);
});

前端方法的優點是提升用戶體驗,缺點是可以被繞過。因此后端驗證是必須的。

后端防止重復提交

4. Token令牌機制

這是比較傳統但有效的方法,適合表單提交場景。

工作流程:

  • 用戶訪問頁面時,后端生成唯一Token
  • Token隨頁面返回給前端
  • 提交表單時攜帶Token
  • 后端驗證Token有效性
  • 驗證成功后立即刪除Token

Java實現示例:

@Component
publicclassTokenService{

// 生成Token
publicString createToken(HttpServletRequest request) {
String token = UUID.randomUUID().toString();
// 存儲到Session中
        request.getSession().setAttribute("FORM_TOKEN", token);
return token;
    }

// 驗證Token
publicboolean verifyToken(HttpServletRequest request) {
String clientToken = request.getParameter("token");
if (clientToken == null) {
returnfalse;
        }

        HttpSession session = request.getSession();
String serverToken = (String) session.getAttribute("FORM_TOKEN");

if (serverToken == null || !serverToken.equals(clientToken)) {
returnfalse;
        }

// 驗證成功后立即刪除
        session.removeAttribute("FORM_TOKEN");
returntrue;
    }
}

前端表單:

<formaction="/submit"method="post">
<inputtype="hidden"name="token"value="${token}">
<!-- 其他表單字段 -->
<buttontype="submit">提交</button>
</form>

5. AOP + Redis方案

適合分布式系統,利用Redis實現分布式鎖。

定義注解:

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public@interface PreventDuplicate {
intexpire()default 5; // 鎖定時間,默認5秒
String key()default ""; // 自定義鎖key
}

實現切面:

@Aspect
@Component
publicclassDuplicateSubmitAspect{

    @Autowired
private RedisTemplate<String, String> redisTemplate;

    @Around("@annotation(preventDuplicate)")
publicObject checkDuplicate(ProceedingJoinPoint joinPoint, 
                               PreventDuplicate preventDuplicate) throws Throwable {

        HttpServletRequest request = getRequest();
String lockKey = buildLockKey(request, preventDuplicate);
int expireTime = preventDuplicate.expire();

// 嘗試加鎖
Boolean success = redisTemplate.opsForValue()
            .setIfAbsent(lockKey, "1", Duration.ofSeconds(expireTime));

if (!success) {
thrownewRuntimeException("請勿重復提交");
        }

try {
return joinPoint.proceed(); // 執行原方法
        } finally {
// 根據業務需求決定是否立即刪除鎖
// redisTemplate.delete(lockKey);
        }
    }

privateString buildLockKey(HttpServletRequest request, 
                              PreventDuplicate preventDuplicate) {
String userId = getUserId(request); // 獲取用戶ID
String uri = request.getRequestURI();
String params = request.getQueryString() != null ? 
                       request.getQueryString() : "";

return"submit:lock:" + userId + ":" + uri + ":" + 
               DigestUtils.md5DigestAsHex(params.getBytes());
    }

private HttpServletRequest getRequest() {
        RequestAttributes attributes = RequestContextHolder.getRequestAttributes();
        ServletRequestAttributes sra = (ServletRequestAttributes) attributes;
return sra.getRequest();
    }
}

使用方式:

@PostMapping("/order/create")
@PreventDuplicate(expire = 10)
public Result createOrder(@RequestBody OrderDTO order) {
// 業務邏輯
returnResult.success("訂單創建成功");
}

6. 數據庫唯一約束

對于有唯一性要求的業務,可以在數據庫層面保障。

例如訂單表:

CREATETABLE orders (
idBIGINT PRIMARY KEY,
    order_no VARCHAR(64) UNIQUE, -- 訂單號唯一約束
    user_id BIGINT,
    amount DECIMAL(10,2),
    create_time DATETIME
);

在業務代碼中處理:

@Service
publicclassOrderService{

public Result createOrder(OrderDTO order) {
try {
// 嘗試插入訂單
            orderMapper.insert(order);
return Result.success("創建成功");
        } catch (DuplicateKeyException e) {
// 捕獲唯一約束異常
            log.warn("重復訂單: {}", order.getOrderNo());
return Result.error("訂單已存在");
        }
    }
}

方案對比

方案

適用場景

優點

缺點

按鈕禁用

所有前端表單

用戶體驗好

可被繞過

Token機制

表單提交

安全可靠

分布式環境需要共享Session

AOP+Redis

分布式系統

無侵入,靈活

依賴Redis

數據庫約束

有唯一性要求

絕對可靠

只能防止最終重復

實踐建議

  1. 前后端結合使用:前端防止誤操作,后端保障數據安全
  2. 合理設置超時時間:一般5-10秒足夠,避免影響正常操作
  3. 友好提示用戶:不要直接報錯,提示"操作進行中"或"請勿重復提交"
  4. 記錄重復提交:監控重復提交情況,幫助優化系統
  5. 考慮冪等性:重要業務要實現冪等接口

防止重復提交是系統穩定性的基礎保障。選擇方案時要根據實際業務需求,有時候需要多種方案組合使用,才能達到最好的效果。

最重要的是,不要完全依賴前端的防護,后端必須要有相應的驗證機制。這樣才能確保系統的數據安全和業務穩定。

責任編輯:龐桂玉 來源: web前端開發
相關推薦

2022-05-25 09:55:40

數據重復提交Java

2020-07-17 07:59:55

數據

2022-06-28 10:17:23

安全職位首席信息安全官

2009-07-08 11:27:05

敏捷方法

2013-11-13 11:01:14

表單表單重復提交表單策略

2013-11-13 14:39:53

表單提交開發

2022-10-28 15:30:27

大數據大數據模型

2022-11-11 07:34:43

2023-05-17 18:54:07

Linux代碼

2020-10-29 07:52:43

JS JavaScript函數

2025-10-28 02:11:00

AI幻覺AI輸出工具

2010-09-04 10:49:16

數據泄密DLPCheck Point

2022-11-15 07:39:48

2022-11-17 07:43:13

2017-07-20 10:46:57

網頁CDN加速緩存

2022-11-15 16:54:54

2023-08-03 15:13:59

混合云Kubernetes

2023-05-16 16:03:10

2025-10-31 00:30:00

.NET內存優化

2013-11-01 09:51:39

點贊
收藏

51CTO技術棧公眾號

国产素人视频在线观看| 国产一区二区视频免费观看| 五月综合久久| 欧美日本一道本在线视频| 免费观看国产视频在线| 少妇精品视频一区二区| 日本不卡免费在线视频| 欧美大片免费看| 黄瓜视频污在线观看| 亚洲在线资源| 日韩欧美一区视频| 福利网在线观看| 欧美少妇另类| 国产乱码字幕精品高清av | 国产精品人人人人| 亚洲精品无吗| 日韩视频123| 日韩精品免费播放| 6699嫩草久久久精品影院| 国产精品视频在线看| 国产女人水真多18毛片18精品| 久久久精品少妇| 牛牛精品成人免费视频| 欧美亚洲自拍偷拍| 搞av.com| 在线观看小视频| 日本一区二区久久| 欧美成人综合一区| 成人久久久精品国产乱码一区二区 | 在线综合+亚洲+欧美中文字幕| 日韩久久不卡| 五月天福利视频| 国产二区国产一区在线观看| 国产乱肥老妇国产一区二 | 亚洲一区在线不卡| 国产一级片在线| 99国产精品99久久久久久| 国产欧美精品久久久| 日本一本在线观看| 日韩视频二区| 久久久久久久999| 免费一级片在线观看| 午夜av一区| 日韩一区二区久久久| 欧美a在线播放| 欧美午夜精彩| 在线免费看av不卡| 久久久久久久毛片| 大色综合视频网站在线播放| 亚洲男子天堂网| 亚洲最大的黄色网| 色天下一区二区三区| 亚洲国产日韩欧美在线图片| 国产xxxx视频| 狼人天天伊人久久| 亚洲精品wwwww| 日韩av手机在线播放| 国产精品男女| 日韩高清免费在线| 新91视频在线观看| 欧美天天综合| xxxx欧美18另类的高清| 欧美日韩综合一区二区| 精品99视频| 97av在线视频| 尤物视频免费观看| 精品一区二区三区在线观看国产| 性欧美视频videos6一9| 国产无遮挡aaa片爽爽| 黄色成人av网站| 91国产一区在线| 无码人妻aⅴ一区二区三区有奶水| 91成人精品| 欧美第一黄色网| 日韩 欧美 综合| 日本vs亚洲vs韩国一区三区| 国产日韩精品在线观看| www.国产.com| 久久香蕉国产线看观看99| 日韩精品久久久免费观看| 日本www在线| 亚洲一区在线观看视频| 久久精品一区二| 99视频这里有精品| 日韩精品专区在线| 成人影视免费观看| 欧美gayvideo| 午夜精品久久久久久久99黑人| 日韩精品一区二区三区在线视频| 亚洲精品动态| 中文字幕久热精品视频在线| 久久国产精品国语对白| 亚洲大胆在线| 国产精品久久久久久av下载红粉 | 色婷婷狠狠综合| 看看黄色一级片| 成人在线视频中文字幕| 一区二区三区天堂av| 九九视频免费在线观看| 久久天堂成人| 国产69精品久久久久9999apgf| 国产人妻精品一区二区三| 成人午夜精品一区二区三区| 亚洲国产欧美不卡在线观看 | 中文字幕观看在线| 高清国产一区二区| 日本在线观看一区| 好看的中文字幕在线播放| 欧亚洲嫩模精品一区三区| 亚洲av无码专区在线播放中文| 日韩一区二区三区精品| 精品亚洲夜色av98在线观看| 性欧美videos| 三级一区在线视频先锋| 国产一区在线观| 直接在线观看的三级网址| 欧洲生活片亚洲生活在线观看| 热久久精品免费视频| 风间由美性色一区二区三区四区| 日韩精品在线一区二区| 大胸美女被爆操| 国产欧美在线| 国产精品对白刺激久久久| av在线之家电影网站| 欧美日韩亚洲国产一区| 麻豆短视频在线观看| 一区二区电影| 国产主播喷水一区二区| 国产精品久久一区二区三区不卡 | 成年人av电影| 六月丁香婷婷久久| 欧美日韩国产免费一区二区三区| 成人午夜电影在线观看| 欧美日韩在线第一页| 在线观看成人动漫| 欧美三级午夜理伦三级中文幕| 久久久免费精品| 亚洲国产视频一区二区三区| 亚洲伦理在线精品| 四虎成人在线播放| 亚洲天堂一区二区三区四区| 91精品国产综合久久久久久蜜臀| www五月婷婷| 一区二区三区在线视频免费| 一级片免费在线观看视频| 成人免费电影网址| 国产精品国产自产拍高清av水多| 国产黄色片网站| 亚洲色图制服诱惑| 五月天婷婷在线观看视频| 99精品在线免费在线观看| 成人福利在线视频| 成人免费在线| 精品国产乱码久久久久久夜甘婷婷| 中文幕无线码中文字蜜桃| 老司机一区二区三区| 快播亚洲色图| 成人亚洲免费| 欧美裸体男粗大视频在线观看| www.av麻豆| 久久久777精品电影网影网 | 久久一区亚洲| 日韩精品av一区二区三区| 欧美日韩免费电影| 欧美刺激性大交免费视频| 国产绳艺sm调教室论坛| 一卡二卡欧美日韩| 国产一级伦理片| 丝袜美腿一区二区三区| 亚洲资源视频| 91在线一区| 日本三级久久久| 免费在线观看黄色| 亚洲国产天堂久久综合网| 无码人妻av一区二区三区波多野| 大陆成人av片| 97在线播放视频| 色爱综合网欧美| 国产高清在线一区二区| 性欧美hd调教| 九九九久久久久久| 日本成人动漫在线观看| 在线视频综合导航| 69xx绿帽三人行| 久久综合久久综合久久综合| 手机免费av片| 亚洲免费综合| 在线观看成人免费| 神马日本精品| 91亚洲va在线va天堂va国| 91福利在线尤物| 中文字幕精品久久| 污视频在线免费观看| 欧美理论电影在线| 日韩视频免费观看高清| 国产精品理论片| 制服丝袜第一页在线观看| 六月丁香婷婷久久| 日韩精品一区二区三区久久| 你懂的亚洲视频| 日韩欧美三级电影| 国产精品色在线网站| 国产精品激情av电影在线观看 | 久久久久久久激情视频| 国产69精品久久app免费版| 91麻豆精品国产| 亚洲图片欧美日韩| 亚洲午夜激情av| 中国一级片在线观看| 久久亚洲一区二区三区四区| 岛国大片在线免费观看| 久久99热99| 激情综合网婷婷| 极品av少妇一区二区| 最新中文字幕久久| 欧美亚洲国产一区| 欧美成ee人免费视频| 国内精品国产成人国产三级粉色| 久久免费高清视频| 蜜桃视频在线观看www社区 | 青娱乐精品在线| 免费一级片91| 成人免费无码av| 国产欧美日本| 青青草国产精品视频| 欧美国产激情| 裸体大乳女做爰69| 99久久www免费| 日韩欧美一区二区三区久久婷婷| 国内自拍亚洲| 国产精品久久久久av免费| 91久久国产综合久久91猫猫| 欧美激情中文网| 日本三级韩国三级欧美三级| 久久这里只有精品99| 麻豆tv免费在线观看| 中文字幕在线观看亚洲| 国产毛片在线| 在线观看日韩欧美| 岛国最新视频免费在线观看| 亚洲日本中文字幕| 天堂在线视频观看| 亚洲精品suv精品一区二区| 丰满熟女一区二区三区| 欧美精品一区二区三区久久久| 日韩免费观看网站| 欧美日韩伦理片| 亚洲欧美综合另类中字| 十八禁一区二区三区| 精品国产91乱码一区二区三区| 在线观看国产亚洲| 欧美日韩日本国产| 精品国产乱子伦| 欧美午夜一区二区三区免费大片| 福利所第一导航| 一区二区日韩电影| 豆国产97在线 | 亚洲| 午夜精品一区二区三区电影天堂| 精品亚洲aⅴ无码一区二区三区| 精品一区二区影视| 欧美激情成人网| 蜜臀a∨国产成人精品| 91亚洲精品久久久蜜桃借种| 国产毛片精品视频| 99热超碰在线| 91小视频在线观看| 久久久久久国产免费a片| 亚洲欧美在线高清| 九九视频在线观看| 色妹子一区二区| 91成人在线免费| 精品国产百合女同互慰| 美女毛片在线看| 久久精品国产96久久久香蕉| 黄色在线观看视频网站| 欧美在线www| 亚洲国产综合在线观看| 国产99视频精品免费视频36| 亚洲成人一品| www.黄色网址.com| 亚洲综合国产| 色噜噜狠狠一区二区| 大胆亚洲人体视频| 男人的天堂官网| 一区二区三区日韩精品视频| 国产又大又黄又粗| 欧美猛男gaygay网站| 日韩一级片免费看| 日韩中文字幕精品| 老牛影视精品| 91精品免费看| 制服丝袜日韩| 丁香色欲久久久久久综合网| 香蕉av777xxx色综合一区| 91插插插影院| 国产日韩欧美在线一区| 国产精品theporn动漫| 欧美丝袜丝交足nylons| 人妻无码中文字幕免费视频蜜桃| 日韩美女一区二区三区四区| 天堂在线资源库| 中文字幕亚洲激情| eeuss鲁一区二区三区| 国产精品高潮在线| 精品国产影院| 久久久久久久久影视| 日韩国产在线观看| 国产麻豆剧传媒精品国产av| 亚洲少妇30p| 怡红院成永久免费人全部视频| 欧美日韩一二三| 日韩精品一二| 欧美激情奇米色| 成年永久一区二区三区免费视频| 国产自产女人91一区在线观看| 成人在线观看免费播放| 久久久久久a亚洲欧洲aⅴ| 欧美精品麻豆| 色网站在线视频| 国产精品网友自拍| 蜜臀99久久精品久久久久小说| 欧美性大战久久久久久久蜜臀| 中文字字幕在线观看| 国产视频精品自拍| 成人免费网站观看| av在线不卡一区| 亚洲色图欧美| 日本在线观看视频一区| 国产欧美日韩亚州综合| www.久久久久久久| 亚洲国产欧美久久| 蜜臀av国内免费精品久久久夜夜| 91精品国产高清| 91大神精品| 日本一级黄视频| 国产资源在线一区| 疯狂撞击丝袜人妻| 欧美日本一道本| 毛片av在线| 成人在线视频网| 欧美激情理论| 一级黄色片国产| 亚洲六月丁香色婷婷综合久久 | 欧美一区不卡| 欧洲在线免费视频| 亚洲精品菠萝久久久久久久| 国产日韩在线观看一区| 日日狠狠久久偷偷四色综合免费| 金瓶狂野欧美性猛交xxxx| 99中文字幕| 亚洲毛片av| 天天躁日日躁aaaa视频| 欧美日韩一区二区免费在线观看 | 午夜无码国产理论在线| 欧美中文娱乐网| 美女视频免费一区| 在线观看亚洲网站| 欧美大片免费久久精品三p | 欧美激情一区二区三区不卡| 国产精品第6页| 久久久91精品国产| 福利在线一区| 免费在线观看的毛片| 国产精品久久久久久久午夜片 | 国产一级久久| 亚洲午夜精品久久久久久高潮| 亚洲一区二区精品久久av| 天天干天天爽天天操| 日韩av第一页| 日韩高清欧美| 国产欧美视频一区| 狠狠久久五月精品中文字幕| av在线天堂| av成人免费观看| 久久精品动漫| 女人18毛片毛片毛片毛片区二| 色呦呦网站一区| 秋霞午夜在线观看| 国产在线精品一区二区三区》| 久久久久久久久久久妇女| 日韩女优在线视频| 欧洲av一区二区嗯嗯嗯啊| av在线免费网址| 欧美精品一区二区三区四区五区| 激情久久久久久| 日本免费www| 日韩欧美一区二区在线视频| 午夜影院一区| 中文字幕第50页| 国产欧美一区二区精品久导航 | 在线精品亚洲一区二区不卡| 日本在线视频站| 精品蜜桃传媒| 精品亚洲成a人在线观看| jizz国产免费| 色老头一区二区三区| 天堂一区二区三区四区| 视频区 图片区 小说区| 日韩欧美国产视频| 污污的网站在线免费观看|