快取配置
通常情況下,限流器使用你預設的快取驅動,由 cache 配置檔案中的 default 鍵定義。你也可以透過在你的應用程式的 cache 配置檔案中定義一個 limiter 來指定限流器應該使用哪一個快取來驅動:
'default' => 'memcached',
'limiter' => 'redis',
使用
將 throttle
middleware 速率限制器附加到路由或路由組即可
throttle 中介軟體第一個引數是頻率(次),第二個引數是時間(分鐘)。下面程式碼塊表示 1 分鐘最多請求 10 次
Route::get('info', [UserController::class, 'info'])->middleware(['throttle:10,1']);
如果我們在設定的分鐘數內請求次數超過了我們設定的頻率次數,則會返回如下:
改造
如果我們想要得到 JSON 響應而不是得到一個 HTML,我們可以這樣進行操作:
1、在 App\Http\Middleware
目錄下建立新的中介軟體 ThrottleRequests
php artisan make:middleware ThrottleRequests
2、將 \Illuminate\Routing\Middleware\ThrottleRequests
內容複製到 \App\Http\Middleware\ThrottleRequests
內,並修改:
use App\Helpers\ResponseEnum;
use ApiResponse;
protected function handleRequest($request, Closure $next, array $limits)
{
foreach ($limits as $limit) {
if ($this->limiter->tooManyAttempts($limit->key, $limit->maxAttempts)) {
// 此處為修改後的自定義響應
$this->throwBusinessException(ResponseEnum::HTTP_ERROR, '操作頻繁');
// throw $this->buildException($request, $limit->key, $limit->maxAttempts, $limit->responseCallback);
}
$this->limiter->hit($limit->key, $limit->decayMinutes * 60);
}
$response = $next($request);
foreach ($limits as $limit) {
$response = $this->addHeaders(
$response,
$limit->maxAttempts,
$this->calculateRemainingAttempts($limit->key, $limit->maxAttempts)
);
}
return $response;
}
3、修改 App\Http
路由中介軟體 $routeMiddleware
中的 throttle
'throttle' => \App\Http\Middleware\ThrottleRequests::class,
4、測試一下,當我們訪問頻率大於設定的次數時會返回:
{
"status": "fail",
"code": 200302,
"message": "操作頻繁",
"data": null,
"error": null
}
本作品採用《CC 協議》,轉載必須註明作者和本文連結