Laravel API 速率限制器的使用

缓存配置

通常情况下,限流器使用你默认的缓存驱动,由 cache 配置文件中的 default 键定义。你也可以通过在你的应用程序的 cache 配置文件中定义一个 limiter 来指定限流器应该使用哪一个缓存来驱动:

'default' => 'memcached',
'limiter' => 'redis',

使用

将 throttle middleware 速率限制器附加到路由或路由组即可

throttle 中间件第一个参数是频率(次),第二个参数是时间(分钟)。下面代码块表示 1 分钟最多请求 10 次

Route::get('info', [UserController::class, 'info'])->middleware(['throttle:10,1']);

如果我们在设定的分钟数内请求次数超过了我们设定的频率次数,则会返回如下:

Laravel API 速率限制器的使用

改造

如果我们想要得到 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)) {
			    // 此处为修改后的自定义响应
                return $this->fail(ResponseEnum::HTTP_ACTION_COUNT_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
}

本站部分文章、图片等数据来自互联网,一切版权均归源网站或源作者所有

如果侵犯了你的权益请来信告知删除。邮箱:1029167904@qq.com


发表评论

评论列表,共 0 条评论

cover cover cover

  • cover

    搁浅 周杰伦

  • cover

    呼啸的风 侯明昊

  • cover

    如果可以 韦礼安