Lumen 使用 throttle 限制接口访问频率
前言
今天碰到过这样一个情况,我需要限制用户请求某个API
接口的频率,比如登录、反馈等提交操作,经过一番搜索+折腾,总算是实现了。
在
Laravel 5.2
的新特性中增加了一个throttle
中间件,通过它可以在路由层限制API
访问的频率。例如限制频率为 1 分钟 50 次,如果一分钟内超过了这个限制,它就会响应:429: Too Many Attempts。
但我在项目中使用的是Lumen
框架(它只有Laravel
中的一部分功能),它并没有集成这个中间件,所以本文主要是记录如何在Lumen
框架中加入throttle
中间件。
开始
首先我们要在app\Http\Middleware
中新建ThrottleRequests.php
文件。
并且把以下链接中的代码拷贝到这个文件中:
https://github.com/illuminate/routing/blob/master/Middleware/ThrottleRequests.php
接着修改文件中的命名空间:
1 | namespace App\Http\Middleware; |
标记同一用户端请求
因为Lumen
框架缺失部分功能,我们需要修改ThrottleRequests.php
中的resolveRequestSignature
方法:
1 | protected function resolveRequestSignature($request){ |
抛出响应
throttle
超过限制时抛出的是Illuminate\Http\Exceptions\ThrottleRequestsException
,同样Lumen
框架缺少这个文件,需要自己定义一下,在app/Exceptions
中新建ThrottleException.php
,写入以下代码:
1 |
|
在app/Exceptions/Handler.php
捕获该抛出异常,在render
方法增加以下判断:
1 | if ($exception instanceof ThrottleException) { |
修改ThrottleRequests.php
文件中的buildException
方法:
1 | protected function buildException($key, $maxAttempts){ |
需在文件头部中添加这一行:
use App\Exceptions\ThrottleException;
注册中间件
在bootstrap/app.php
中注册:
1 | $app->routeMiddleware([ |
到这里我们就加入成功了,接着在路由中添加中间件即可:
1 | $router->group(['middleware' => ['throttle:10,2']],function() use ($router){ |
其中throttle:10,2
表示的是 2 分钟内访问 10 次。
🥳 加载 Disqus 评论