国产+高潮+在线,国产 av 仑乱内谢,www国产亚洲精品久久,51国产偷自视频区视频,成人午夜精品网站在线观看

大佬們對于api并發(fā)時(shí)防止重復(fù)提交有什么好的方案嗎?

張大娃

大佬們對于api并發(fā)時(shí)防止重復(fù)提交有什么好的方案嗎?

5234 14 3
14個(gè)回答

liziyu

先限流,再入隊(duì)列排隊(duì),這種呢!~

  • 張大娃 2022-09-09

    對于需要及時(shí)返回?cái)?shù)據(jù)的用隊(duì)列不是太合適把

2548a

個(gè)人經(jīng)驗(yàn),前端按鈕限制最方便省事.

  • liziyu 2022-09-09

    接口暴露,直接刷接口了! ^_^

  • 2548a 2022-09-09

    你說這種情況不屬于重復(fù)提交范圍,我理解的重復(fù)提交就是接口防止用戶網(wǎng)絡(luò)卡頓或者點(diǎn)擊過快導(dǎo)致的重復(fù)請求.

  • 張大娃 2022-09-09

    前端限流是需要的,但是對于直接刷接口的無效

evilk

對于前端用戶提交的,前端需要做

  • 點(diǎn)擊按鈕后,disabled按鈕
  • csrf-token

對于API接口

  • 如果是提交訂單,可以通過數(shù)據(jù)庫訂單號,唯一索引來防止重復(fù)提交
  • 張大娃 2022-09-09

    如果多次提交每次生成的訂單號應(yīng)該不是唯一的了

MarkGo

并發(fā)和重復(fù)提交是兩個(gè)不同概念吧。

并發(fā)不會導(dǎo)致重復(fù)提交;
針對多次點(diǎn)擊等等的,簡單方式是前端限制;
如果是被刷接口,那就要看你的業(yè)務(wù)性質(zhì),是登錄用戶才能使用還是所有人能使用;

如果登錄用戶才能使用:
根據(jù)UID生成一個(gè)form的token,一個(gè)UID對應(yīng)一個(gè)token,每次提交都把token重置,然后驗(yàn)證token是否最新的即可。

如果不限制用戶的:
根據(jù)用戶IP地址結(jié)合瀏覽器指紋進(jìn)行限制,但這種都不是100%解決你的問題,類似的可以參考攜程/美團(tuán) 酒店列表之類的,為了防止爬蟲未登錄的賬號查詢都不會返回價(jià)格。

  • 張大娃 2022-09-09

    那就是在每次提交前先預(yù)生成一個(gè)唯一token給前端,用于每次提交攜帶進(jìn)去驗(yàn)證?

  • MarkGo 2022-09-12

    看你實(shí)際場景,如果是單純做API服務(wù)的,通過key進(jìn)行qps限制即可了。
    如果你們是被別人趴了接口出來的那種,你可以嘗試每個(gè)頁面的表單生成一個(gè)token。提交驗(yàn)證就可以了,但這樣只是限制了別人不能同一時(shí)間發(fā)送相同表單請求

不敗少龍

controller之前redis枷鎖,處理完就redis解鎖

ersic

csrf token

  • 暫無評論
小W

這個(gè)就要看具體使用場景,qps和key限制基本上都能解決,redis無法也是這個(gè)原理

  • 暫無評論
zhaohanfeng

這個(gè)正好前兩天遇到這個(gè)問題了,你們api請求有數(shù)字簽名嗎?帶時(shí)間戳那種計(jì)算出來的數(shù)字簽名,用這個(gè)簽名做key,然后利用redis的原子計(jì)數(shù)器,大于1的代表重復(fù)請求的,然后拋出異常之類的處理即可

  • 暫無評論
aveadtyx

我百度的使用redis鎖

//防止重復(fù)提交 加redis鎖
$key = '_punch_'.$user['id'].'_'.$data['landmark_pk'];
$rs = RedisLocal::get_redis();
$ttl = 10;
$lock = $rs->set($key, $key, ['nx', 'ex' => $ttl]);
if (!$lock) {
throw new BaseException(['code' => -1, 'msg' => '請不要頻繁提交哦~']);
}
$res = $this->checkPrize($params);
if ($rs->get($key) == $key) {
$rs->del($key);
}
  • 暫無評論
chaz6chez

首先要區(qū)分是從用戶發(fā)起的還是從跨站攻擊的;
如果是用戶發(fā)起的,每個(gè)用戶都會攜帶憑證,如JWT、cookie等信息,那么我們可以從業(yè)務(wù)的角度進(jìn)行限制,做一些用戶級別的api防抖或者限流,如:redis設(shè)置一個(gè)防抖閾值,總之就是以用戶+業(yè)務(wù)為顆粒度保存一個(gè)計(jì)數(shù)并限制;

我們還可以基于一種約定,設(shè)置一些request token,比如md5(query string/http body + timestamp + jwt/session id),保證一次請求一次token;當(dāng)然這種約定如果是web端,代碼很容易被找到,在app上面比較有效;這樣的好處是也可以有效防止csrf;

當(dāng)然從服務(wù)端出發(fā),我們還可以基于接口的顆粒度設(shè)置一些限流服務(wù),比如使用基于Redis-lua的限流插件;

我的建議是服務(wù)端最好把以上三種都實(shí)現(xiàn),同時(shí)客戶端做好防抖。

公共接口的話,使用一些人機(jī)驗(yàn)證組件即可。

  • 暫無評論
meows

訪問頁面時(shí)候生成一個(gè)令牌,表單令牌相同提交訂單(令牌相同立馬刪除令牌,然后進(jìn)行下單流程),失敗就提示下單失敗。
要不你就加個(gè)鎖,此時(shí)只能有一個(gè)鎖在執(zhí)行,拒絕相同請求。

  • 小W 2022-10-10

    生成令牌也無法保證頻繁的調(diào)用接口啊

powerbowen

相同提交內(nèi)容生成相同的簽名,同用戶標(biāo)識同簽名做分布式鎖

  • 暫無評論
職業(yè)搬磚

冪等

  • 暫無評論
EchoNoch

有沒有辦法不通過redis實(shí)現(xiàn)

  • chaz6chez 2023-02-06

    文件,fopen或者sqlite;但這種只能單機(jī)

年代過于久遠(yuǎn),無法發(fā)表回答
??