W3Cschool
恭喜您成為首批注冊(cè)用戶(hù)
獲得88經(jīng)驗(yàn)值獎(jiǎng)勵(lì)
為防止濫用,你應(yīng)該考慮對(duì)您的 API 限流。 例如,您可以限制每個(gè)用戶(hù) 10 分鐘內(nèi)最多調(diào)用 API 100 次。 如果在規(guī)定的時(shí)間內(nèi)接收了一個(gè)用戶(hù)大量的請(qǐng)求,將返回響應(yīng)狀態(tài)代碼 429 (這意味著過(guò)多的請(qǐng)求)。
要啟用限流, ?user identity class
? 應(yīng)該實(shí)現(xiàn) ?yii\filters\RateLimitInterface
?。 這個(gè)接口需要實(shí)現(xiàn)以下三個(gè)方法:
getRateLimit()
?:返回允許的請(qǐng)求的最大數(shù)目及時(shí)間,例如,?[100, 600]
? 表示在 600 秒內(nèi)最多 100 次的 API 調(diào)用。loadAllowance()
?:返回剩余的允許的請(qǐng)求和最后一次速率限制檢查時(shí) 相應(yīng)的 UNIX 時(shí)間戳數(shù)。saveAllowance()
?:保存剩余的允許請(qǐng)求數(shù)和當(dāng)前的 UNIX 時(shí)間戳。你可以在 user 表中使用兩列來(lái)記錄容差和時(shí)間戳信息。 loadAllowance()
和 saveAllowance()
可以通過(guò)實(shí)現(xiàn)對(duì)符合當(dāng)前身份驗(yàn)證的用戶(hù)的這兩列值的讀和保存。 為了提高性能,你也可以考慮使用緩存或 NoSQL 存儲(chǔ)這些信息。
用戶(hù)模型中的實(shí)現(xiàn)如下所示:
public function getRateLimit($request, $action)
{
return [$this->rateLimit, 1]; // $rateLimit requests per second
}
public function loadAllowance($request, $action)
{
return [$this->allowance, $this->allowance_updated_at];
}
public function saveAllowance($request, $action, $allowance, $timestamp)
{
$this->allowance = $allowance;
$this->allowance_updated_at = $timestamp;
$this->save();
}
一旦 identity 實(shí)現(xiàn)所需的接口,Yii 會(huì)自動(dòng)使用 ?yii\filters\RateLimiter
?為 ?yii\rest\Controller
?配置一個(gè)行為過(guò)濾器來(lái)執(zhí)行速率限制檢查。如果速度超出限制, 該速率限制器將拋出一個(gè) ?yii\web\TooManyRequestsHttpException
?。
你可以參考以下代碼 在你的 REST 控制器類(lèi)里配置速率限制:
public function behaviors()
{
$behaviors = parent::behaviors();
$behaviors['rateLimiter']['enableRateLimitHeaders'] = false;
return $behaviors;
}
當(dāng)速率限制被激活,默認(rèn)情況下每個(gè)響應(yīng)將包含以下 HTTP 頭發(fā)送目前的速率限制信息:
X-Rate-Limit-Limit
?:同一個(gè)時(shí)間段所允許的請(qǐng)求的最大數(shù)目;X-Rate-Limit-Remaining
?:在當(dāng)前時(shí)間段內(nèi)剩余的請(qǐng)求的數(shù)量;X-Rate-Limit-Reset
?:為了得到最大請(qǐng)求數(shù)所等待的秒數(shù)。你可以禁用這些頭信息通過(guò)配置 ?yii\filters\RateLimiter::$enableRateLimitHeaders
? 為 false, 就像在上面的代碼示例所示。
Copyright©2021 w3cschool編程獅|閩ICP備15016281號(hào)-3|閩公網(wǎng)安備35020302033924號(hào)
違法和不良信息舉報(bào)電話(huà):173-0602-2364|舉報(bào)郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號(hào)
聯(lián)系方式:
更多建議: