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)) {
                // 此处为修改后的自定义响应
                $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 协议》,转载必须注明作者和本文链接
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
讨论数量: 10

挺详细的,不错 :kissing_heart:

3个月前 评论
巴啦啦臭魔仙 (楼主) 3个月前

博主为什么要限流呢,普通的场景应该用不到吧,

3个月前 评论
巴啦啦臭魔仙 (楼主) 3个月前

这个速率限制,有一个 header ,会提示节流的数据,和恢复重置的时间等数据。 经过你的api响应接口后,这个数据就丢了。另外默认的 429 状态码也变成了200 。看要怎么修改调整一下。

1个月前 评论
巴啦啦臭魔仙 (楼主) 1周前
巴啦啦臭魔仙 (楼主) 1周前

用这玩意儿要注意清理缓存 她不会自动清理过期的数据 我服务器index node 就被耗光了 :see_no_evil: 也不知道是什么原因

1周前 评论
巴啦啦臭魔仙 (楼主) 1周前

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!