一、实现
修改 app/Http/routes.php
Route::get('/user/{user}', function (\App\User $user) {
return $user;
})->middleware('throttle:3');
这里的 3 表示一分钟内只允许请求 3 次
修改 app/Providers/RouteServiceProvider.php 的 boot 方法
public function boot(Router $router)
{
parent::boot($router);
}
使用 curl 进行测试
curl http://localhost:8000/user/10
红色框中
X-RateLimit-Limit = 3 表示一分钟内只允许请求 3 次
X-RateLimit-Remaining = 2 表示一分钟内剩余请求 2 次
第四次 curl
报错:Too Many Requests。
二、源码
访问 app/Http/Kernel.php,滑倒最后
点击 \Illuminate\Routing\Middleware\ThrottleRequests 跳转到这里类,查看 hadel 方法
查看方法中的签名:resolveRequestSignature,跳转到 fingerprint 看到签名的方式
查看 tooManyAttempts:对生成的签名进行缓存了,如果超过限制就会返回 true
通过 buildResponse 抛出异常
如果没有超过限制,就会通过 hit 方法加 1
查看 addHeaders 方法,可以看到 X-RateLimit-Limit 和 X-RateLimit-Remaining