精品欧美一区二区三区在线观看 _久久久久国色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技術棧公眾號

视频一区二区三区免费观看| 国内偷自视频区视频综合| 91精品无人成人www| 久操视频在线| 91麻豆免费观看| 91精品久久久久久久久久入口| 国产亚洲精品成人| 精品高清在线| 精品捆绑美女sm三区 | 国产理论电影在线观看| 国产精品一区二区黑丝| 日本久久亚洲电影| 久草免费在线视频观看| heyzo久久| 亚洲娇小xxxx欧美娇小| 国内外成人免费在线视频| 1区2区3区在线| 中文字幕综合网| 久久综合伊人77777麻豆| 国产乱叫456在线| 丝袜美腿亚洲一区二区图片| 欧美国产高跟鞋裸体秀xxxhd| 中文字幕第20页| 欧美顶级毛片在线播放| 精品人在线二区三区| 加勒比av中文字幕| 欧美日韩精品免费观看视欧美高清免费大片| 一区二区三区欧美激情| 亚洲精品中文字幕在线| 亚洲av成人无码久久精品老人 | 91日韩在线视频| 999视频在线| 亚洲在线成人| 97欧美精品一区二区三区| 国产一二三区精品| 天天精品视频| 日韩中文字幕av| 性猛交娇小69hd| 综合综合综合综合综合网| 亚洲成人教育av| zjzjzjzjzj亚洲女人| 精品国产一区二| 91精品啪在线观看国产60岁| 激情五月俺来也| 成人亚洲视频| 欧美日韩一区二区三区免费看| 日本不卡在线观看视频| 亚洲美女尤物影院| 色综合欧美在线视频区| 国产av国片精品| 超碰高清在线| 欧美日韩中文字幕日韩欧美| 999在线观看视频| а√在线中文在线新版| 黑人狂躁日本妞一区二区三区| 国产曰肥老太婆无遮挡| av在线资源| 精品日本高清在线播放| 国模吧无码一区二区三区| 韩日精品一区二区| 在线观看www91| 亚洲一区二区三区四区五区| 日日夜夜一区| 日韩免费视频一区二区| 香蕉久久久久久av成人| 豆花视频一区二区| 亚洲美女在线观看| 国产综合精品久久久久成人av| 欧洲杯半决赛直播| y97精品国产97久久久久久| 中文字幕在线观看成人| 一区视频在线看| 日本精品一区二区三区在线播放视频 | 校园春色 亚洲色图| 少妇愉情理伦片bd| 91激情在线| 国产精品久久久久影院色老大| 成年人免费观看的视频| 日本小视频在线免费观看| 亚洲福利国产精品| 日韩免费高清在线| 国产精品国产亚洲精品| 亚洲成人免费网站| 能免费看av的网站| 亚洲情侣在线| 97婷婷涩涩精品一区| 成人黄色片在线观看| 国产毛片精品国产一区二区三区| 精品免费国产| 日本不卡不卡| 亚洲高清免费视频| 日日噜噜噜噜久久久精品毛片| 在线欧美激情| 亚洲精品丝袜日韩| 婷婷激情四射网| 国产亚洲成人一区| 91麻豆桃色免费看| 日本一二三区在线视频| 亚洲日本青草视频在线怡红院| 六月婷婷在线视频| 91麻豆精品| 亚洲香蕉成视频在线观看| 国产精品白嫩白嫩大学美女| 久久中文在线| 国产精品成人观看视频免费| 北条麻妃在线| 精品国产电影一区| 少妇丰满尤物大尺度写真| 国产欧美一区| 久久乐国产精品| 一本色道久久综合亚洲| 26uuu亚洲综合色| 久久精品xxx| 亚洲欧美在线综合| 亚洲天堂av女优| 激情五月色婷婷| 国产自产视频一区二区三区| 欧美精品亚洲精品| 国产嫩草在线视频| 在线电影院国产精品| av网站免费在线看| 午夜亚洲激情| 国内外成人免费视频| 伊人在我在线看导航| 欧美日本一区二区| 我想看黄色大片| 久久成人国产| 久久精品日韩精品| 波多野结衣在线播放| 日韩写真欧美这视频| 小向美奈子av| 麻豆一区二区99久久久久| 蜜桃传媒视频第一区入口在线看| 国产在线拍揄自揄拍视频| 日韩视频在线一区二区| 男女做暖暖视频| 狠狠网亚洲精品| 一区二区日本伦理| 激情欧美一区二区三区黑长吊| 亚洲网站在线观看| 神马久久久久久久| 久久精品一二三| 黄在线观看网站| 婷婷精品视频| 国产成人久久精品| 成人亚洲性情网站www在线观看| 日韩欧美在线视频免费观看| 91精品国产自产| 男人的天堂亚洲在线| 久久视频在线观看中文字幕| 原纱央莉成人av片| 国产一区二区三区免费视频| 999视频在线| 国产精品美女久久久久久久久 | 国产婷婷色一区二区三区| 男人天堂999| 精品无人区麻豆乱码久久久| 国产精品天天狠天天看| 日本www在线观看| 日韩精品一区二区三区视频在线观看| 国产大学生自拍| 成人免费视频视频在线观看免费| 国产妇女馒头高清泬20p多| 啪啪激情综合网| 亲子乱一区二区三区电影| 国外av在线| 欧美三级精品| 精品国产91久久久久久久妲己| 日韩乱码在线观看| 久久久久国产精品麻豆ai换脸 | 亚洲性生活视频| 亚洲网站在线免费观看| 亚洲乱码国产乱码精品精98午夜| av电影中文字幕| 久久久久久网| 日韩 欧美 自拍| 日本亚洲不卡| 国产精品一区二区三区免费视频| 亚洲91av| 亚洲欧洲av一区二区| 91中文字幕在线视频| 亚洲午夜久久久久久久久电影院| 欧美成人午夜精品免费| 久久精品国产一区二区| 日本欧美视频在线观看| 成人嘿咻视频免费看| 动漫一区二区在线| 成人va天堂| 欧美高清在线播放| jizzjizz在线观看| 精品国产一区久久| 91久久久久久久久久久久| 天天av天天翘天天综合网色鬼国产| 高清国产在线观看| 成人国产免费视频| 国产精品区在线| 99综合在线| 国产精品88久久久久久妇女| 首页亚洲中字| 成人欧美一区二区| 欧美xxxx网站| 日韩女在线观看| 7777kkk亚洲综合欧美网站| 中文字幕日韩在线播放| 少妇一级淫片免费看| 欧美日韩www| 久久久成人免费视频| 亚洲黄色小说网站| 成人黄色短视频| 2020国产精品自拍| 国产免费a级片| 国内精品免费**视频| 亚洲精品高清无码视频| 99精品福利视频| 少妇久久久久久被弄到高潮| 欧美一区三区| 蜜桃传媒一区二区| 国产精品2023| 91久久国产自产拍夜夜嗨| 福利视频亚洲| 欧美在线观看网址综合| 俺来也官网欧美久久精品| 久久伊人精品视频| yw193.com尤物在线| 亚洲精品一二区| 网站黄在线观看| 欧美成人三级电影在线| 国产视频第一页| 91精品免费在线观看| 在线观看xxxx| 欧美亚洲尤物久久| 中文字幕91爱爱| 欧洲精品一区二区三区在线观看| 西西44rtwww国产精品| 亚洲高清中文字幕| 国产午夜精品无码| 午夜成人免费电影| 亚洲一区二区91| 亚洲福利国产精品| 国产午夜精品一区二区理论影院| 亚洲香蕉伊在人在线观| 日本熟妇一区二区| 亚洲成国产人片在线观看| 久久精品国产亚洲AV无码麻豆| 一区二区三区四区精品在线视频| 午夜精品福利在线视频| 一区二区三区在线观看欧美| 九九热精彩视频| 一区二区三区在线视频观看58| 丰满少妇高潮久久三区| 一区二区三区四区在线播放| 欧美日韩精品在线观看视频| 一级特黄大欧美久久久| 精品在线免费观看视频| 午夜欧美视频在线观看| 亚洲 欧美 日韩 综合| 欧美日韩免费网站| 国产主播第一页| 欧美三区在线视频| 国产强被迫伦姧在线观看无码| 欧美一区二区视频在线观看 | 妞干网在线播放| 亚洲久久一区| 国内外免费激情视频| 蜜臂av日日欢夜夜爽一区| 五月天中文字幕在线| 国产成人免费视频网站高清观看视频| 国产a级黄色片| 久久久久久久久久久久久女国产乱| 国产破处视频在线观看| 一级女性全黄久久生活片免费| 一区二区三区视频免费看| 欧洲另类一二三四区| 成人黄色片免费| **精品中文字幕一区二区三区| 亚洲字幕在线观看| 欧美freesex8一10精品| 视频一区二区三区在线观看| 欧美一区激情| 日韩av在线综合| 久久99精品久久久久久动态图| 黑人无套内谢中国美女| 2021久久国产精品不只是精品| www.4hu95.com四虎| 亚洲一区在线观看免费| 伊人中文字幕在线观看| 欧美久久久久久久久中文字幕| 国精产品一品二品国精品69xx | 欧美天堂一区二区三区| 国产精品爽爽久久久久久| 亚洲国产小视频| 黄色在线观看网站| 热久久视久久精品18亚洲精品| 日韩黄色三级在线观看| 国产精品免费一区二区三区| 成人精品亚洲| 久久精品视频16| 国产一区二区三区国产| 中文字幕在线1| 亚洲一区二区高清| 一炮成瘾1v1高h| 亚洲男人的天堂在线| 好看的中文字幕在线播放| 国产在线观看91精品一区| 天堂在线精品| 成人小视频在线观看免费| 美女网站色91| 国产福利短视频| 亚洲一线二线三线视频| 国产又粗又黄又爽视频| 亚洲欧美日韩久久久久久| 日本三级韩国三级欧美三级| 国产美女精品视频| 精品国产美女| 久久久免费视频网站| 成人永久看片免费视频天堂| 性爱在线免费视频| 色综合视频一区二区三区高清| 亚洲精品成人电影| 久久中文字幕国产| 欧美xxxx性| 天天综合狠狠精品| 先锋影音国产一区| 粉嫩av懂色av蜜臀av分享| 一区av在线播放| 国产精品久久久久毛片| 中文字幕亚洲综合久久| 99re66热这里只有精品4| 久久96国产精品久久99软件| 亚洲国产精品一区| 久久国产免费视频| 一区二区三区四区五区视频在线观看| 国产精品无码天天爽视频| 神马久久久久久| 91久久青草| 欧美性视频在线播放| 久久成人免费电影| 少妇高潮惨叫久久久久| 欧美精品在线一区二区三区| 91官网在线| 成人欧美一区二区三区黑人孕妇| 久久精品青草| 亚洲成人激情小说| 亚洲综合在线第一页| 免费看国产片在线观看| 亚州成人av在线| 亚洲传媒在线| 中文字幕永久视频| 国产精品麻豆欧美日韩ww| 怡春院在线视频| 久久久精品2019中文字幕神马| 玖玖精品一区| 欧美大黑帍在线播放| 成人av在线资源| 久热这里只有精品6| 亚洲美腿欧美激情另类| av高清一区| 亚洲一区不卡在线| 国产精品一区二区视频| 国产精品a成v人在线播放| 精品视频www| 成人网ww555视频免费看| 日本一级淫片演员| 成人一区二区视频| 天天操夜夜操视频| 在线午夜精品自拍| 久久99精品久久久野外观看| www.av91| 国产欧美日韩另类一区| 国产免费叼嘿网站免费| 国外成人免费在线播放| 国产伦精品一区二区三区千人斩| 欧美日韩中文不卡| 亚洲国产精品人人做人人爽| 免费动漫网站在线观看| 国产精品夜间视频香蕉| 国产精品成人一区二区网站软件| 三上悠亚ssⅰn939无码播放| 精品视频在线免费看| 性欧美猛交videos| 欧美一区二区三区在线播放| 久久99久久精品| 欧美亚韩一区二区三区| 中文字幕免费国产精品| 亚洲精品不卡在线观看| 丁香婷婷激情网| 亚洲自拍偷拍网站| 超碰免费97在线观看| 国产精品日本一区二区| 肉色丝袜一区二区| 国产性生活网站| 在线观看国产成人av片| jizz性欧美23| 亚洲一级免费观看| 亚洲亚洲人成综合网络| 日本高清视频在线观看| 久久精品二区| 国产老女人精品毛片久久| 免费污污视频在线观看| 欧美老妇交乱视频|