предисловие
Я столкнулся с такой ситуацией сегодня, мне нужно запретить пользователям запрашивать определенныйAPI
Частота интерфейса, такая как вход в систему, обратная связь и другие операции отправки, была наконец реализована после некоторых поисков и метаний.
существует
Laravel 5.2
Добавлена новая функцияthrottle
Промежуточное программное обеспечение, с помощью которого можно установить ограничения на уровне маршрутизации.API
частота посещения. Например, предел частоты составляет 50 раз в минуту, если этот предел будет превышен в течение одной минуты, он ответит: 429: Too Many Attempts.
Но то, что я использую в своем проекте,Lumen
рама (есть толькоLaravel
Часть функции в ), она не интегрирует это промежуточное программное обеспечение, поэтому в этой статье в основном описывается, какLumen
добавлен в рамкуthrottle
промежуточное ПО.
Начинать
Сначала мы должныapp\Http\Middleware
ЧжунсинThrottleRequests.php
документ.
И скопируйте код из следующей ссылки в этот файл:
Затем измените пространство имен в файле:
namespace App\Http\Middleware;
Отметить тот же запрос клиента
потому чтоLumen
В фреймворке отсутствуют некоторые функции, нам нужно изменитьThrottleRequests.php
серединаresolveRequestSignature
метод:
protected function resolveRequestSignature($request){
return sha1(
$request->method() .
'|' . $request->server('SERVER_NAME') .
'|' . $request->path() .
'|' . $request->ip()
);
}
бросить ответ
throttle
То, что выбрасывается при превышении лимита,Illuminate\Http\Exceptions\ThrottleRequestsException
,такой жеLumen
Во фреймворке отсутствует этот файл, вам нужно определить его самостоятельно, вapp/Exceptions
ЧжунсинThrottleException.php
, напишите следующий код:
<?php
namespace App\Exceptions;
use Exception;
class ThrottleException extends Exception{
protected $isReport = false;
public function isReport(){
return $this->isReport;
}
}
существуетapp/Exceptions/Handler.php
Перехватите выброшенное исключение вrender
Метод добавляет следующие суждения:
if ($exception instanceof ThrottleException) {
return response([
'code' => $exception->getCode(),
'msg' => $exception->getMessage()
], 429);
}
ИсправлятьThrottleRequests.php
в файлеbuildException
метод:
protected function buildException($key, $maxAttempts){
$retryAfter = $this->getTimeUntilNextRetry($key);
$headers = $this->getHeaders(
$maxAttempts,
$this->calculateRemainingAttempts($key, $maxAttempts, $retryAfter),
$retryAfter
);
// 修改了这一行
return new ThrottleException('Too Many Attempts.', 429);
}
Эту строку нужно добавить в заголовок файла:
use App\Exceptions\ThrottleException;
зарегистрировать промежуточное ПО
существуетbootstrap/app.php
Зарегистрируйтесь в:
$app->routeMiddleware([
'throttle' => App\Http\Middleware\ThrottleRequests::class,
]);
На данный момент мы успешно добавили, а затем можем добавить промежуточное ПО к маршрутизации:
$router->group(['middleware' => ['throttle:10,2']],function() use ($router){
$router->post('feedback','UserController@addFeedback');
});
вthrottle:10,2
Указывает на 10 посещений за 2 минуты.
Примечание: Данная статья является оригинальной статьей, если вам необходимо перепечатать, пожалуйста, укажите источник.