成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

如何防止接口重復提交?

開發 前端
對于下單流量不算高的系統,可以采用這種請求唯一ID+數據表增加唯一索引約束的方式,來防止接口重復提交!

一、摘要

對于投入運營的軟件系統,最近小編在巡檢項目數據庫的時候,發現某些表存在不少的重復數據,對于這樣的臟數據,初步分析大致的來源有以下可能:

1.由于用戶誤操作,多次點擊表單提交按鈕

2.由于網速等原因造成頁面卡頓,用戶重復刷新提交頁面

3.黑客或惡意用戶使用 postman 等網絡工具,重復惡意提交表單

這些情況都可能會導致表單重復提交,造成數據重復,比如訂單表,重復提交訂單數據所造成的問題,可能不僅僅是數據上的混亂,也會造成業務混亂。

那么問題來了,我們該如何防止用戶重復提交數據呢?

方案實踐如下!

二、方案實踐

下面我們以防止重復提交訂單為例,向大家介紹最簡單的、成本最低的解決辦法。

我們先來看一張圖,這張圖就是本次方案的核心流程圖。

圖片

實現的邏輯,流程如下:

1.當用戶進入訂單提交界面的時候,調用后端獲取請求唯一ID,并將唯一ID值埋點在頁面里面

2.當用戶點擊提交按鈕時,后端檢查這個唯一ID是否用過,如果沒有用過,繼續后續邏輯;如果用過,就提示重復提交

3.最關鍵的一步操作,就是把這個唯一ID 存入業務表中,同時設置這個字段為唯一索引類型,從數據庫層面做防止重復提交

防止重復提交的大體思路如上,實踐代碼如下!

2.1、給數據庫表增加唯一鍵約束

以訂單表為例,新增一個request_id字段,并設置為唯一約束,結構如下:

CREATE TABLE tb_order (
id bigint(20) unsigned NOT NULL,
order_no varchar(100) NOT NULL,
....
request_id varchar(36) NOT NULL,
PRIMARY KEY (id),
UNIQUE KEY uniq_request_id (request_id) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

2.2、編寫獲取請求唯一ID的接口

@RestController
@RequestMapping("api")
public class CommonController {

/**
* 獲取getRequestId
* @return
*/
@RequestMapping("getRequestId")
public ResResult getRequestId(){
String uuid = UUID.randomUUID().toString();
return ResResult.getSuccess(uuid);
}
}

2.3、業務提交的時候,檢查唯一ID

@RestController
@RequestMapping("order")
public class OrderController {

@Autowired
private OrderService orderService;

/**
* 下單
* @param request
* @return
*/
@PostMapping(value = "order/confirm")
public ResResult confirm(@RequestBody OrderConfirmRequest request){
//調用訂單下單相關邏輯
if(StringUtils.isEmpty(request.getRequestId())){
return ResResult.getSysError("請求ID不能為空!");
}
if(request.getRequestId().length() != 36){
return ResResult.getSysError("請求ID格式錯誤!");
}
//檢查當前請求唯一ID,是否已經存在,如果存在,再提交就是重復下單
Order source = orderService.queryByRequestId(request.getRequestId());
if(Objects.nonNull(source)){
return ResResult.getSysError("當前訂單已經提交成功,請勿重復提交");
}
orderService.confirm(request);
return ResResult.getSuccess();
}
}

如果是并發請求也不用擔心,因為數據庫表已經設置了唯一索引,尤其只有一條有效數據會插入成功,可以防止重復的數據產生。

三、小結

對于下單流量不算高的系統,可以采用這種請求唯一ID+數據表增加唯一索引約束的方式,來防止接口重復提交!

雖然簡單粗暴,但是十分有效!

可能有的人會問,看上面的代碼生成請求唯一 ID 很簡單,為啥不直接前端生成一個請求唯一ID,然后提交呢?

之所以把獲取請求唯一ID的生成規則放在后端,好處就是生成規則可以自己定義,也并不一定要用uuid來生成,也可以用雪花算法,或者自己設計一套計算規則,保證當前業務提交時請求ID是唯一的,比如事先生成唯一的訂單號,作為請求唯一ID,然后再提交,規則放在后端來生成,會更加靈活!

責任編輯:武曉燕 來源: Java極客技術
相關推薦

2022-11-15 07:39:48

2022-11-17 07:43:13

2024-06-06 08:46:37

2023-06-05 08:22:20

2013-11-13 11:01:14

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

2013-11-13 14:39:53

表單提交開發

2024-06-21 09:19:45

代碼接口重復請求開發

2020-07-17 07:59:55

數據

2022-05-25 09:55:40

數據重復提交Java

2010-11-23 16:56:04

mysql表單

2024-08-05 09:29:00

前端接口請求

2024-05-28 09:26:46

2009-06-05 10:37:52

struts2 國際化表單

2009-08-24 10:47:45

C#接口重實現

2024-02-19 00:00:00

接口圖形驗證碼

2024-12-16 00:54:05

2024-09-02 11:05:49

2021-02-28 07:43:28

請求提交方案

2021-04-28 14:31:35

Dubbo接口日志

2025-04-27 01:22:00

QPS高并發MySQL
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 美女131mm久久爽爽免费 | 日韩欧美精品在线播放 | hdfreexxxx中国妞| 久久久久久久av麻豆果冻 | 国产精品久久久久久久久免费高清 | 天天摸天天干 | 国产精品美女一区二区三区 | 在线不卡视频 | 亚洲一区二区在线播放 | www.毛片| 国产视频欧美 | 国产精品免费观看 | 99热这里 | 激情的网站 | 国精久久| 久久久久国产精品一区二区 | 日日操夜夜操视频 | 四虎影 | 免费在线观看成人 | 久久久国产精品网站 | 天堂精品视频 | 欧美综合视频 | 青青草av网站 | 成人av鲁丝片一区二区小说 | 欧美综合视频在线 | 国产极品91 | 国产精品国产a级 | 91大神在线资源观看无广告 | 激情五月婷婷综合 | 亚洲一区二区三区在线播放 | 国产精品久久久久无码av | 999久久久国产精品 欧美成人h版在线观看 | 毛片国产| 精品一区二区三区在线视频 | 欧美日韩在线综合 | 欧美aaa一级片 | 欧美日韩高清 | 五月天婷婷狠狠 | 精品国产不卡一区二区三区 | 国产美女在线精品免费 | 一区二区国产精品 |