Lumen框架使用throttle限制接口访问频率
Laravel 5.2的新特性增加了一个限制访问频率的中间件throttle
,通过它可以在路由层限制API访问的频率。例如限制频率1分钟50次,如果一分钟内超过了这个限制,Laravel就会响应:429: Too Many Attempts
。但很遗憾这个特性在Lumen框架没有加入,所以本文主要是教你在Lumen框架中加入throttle
中间件。
throttle
中间件在\Illuminate\Routing\Middleware\ThrottleRequests
,你可以从Laravel 5.2以上的版本获取,当然也可以在github的illuminate/routing
项目获取,这里我们取最新版本的代码。
地址:https://github.com/illuminate/routing/blob/master/Middleware/ThrottleRequests.php
把文件复制到app/Http/Middleware
文件夹,修改命名空间。
namespace App\Http\Middleware;
还有几问题,在lumen框架是没有的,我们需要再改造一下。
标记同一用户端请求
ThrottleRequests.php
文件里的resolveRequestSignature
方法,Lumen框架缺少相应的功能,我们需要改造一下,自己定义一下标记同一用户端的请求,修改文件:
protected function resolveRequestSignature($request)
{
return sha1(
$request->method() .
'|' . $request->server('SERVER_NAME') .
'|' . $request->path() .
'|' . $request->ip()
);
}
抛出相应
Throttle超过限制的次数抛出的是Illuminate\Http\Exceptions\ThrottleRequestsException
,Lumen框架缺少该异常相应的文件,同样我们需要自己定义,可以参考该源文件:
地址:https://github.com/illuminate/http/blob/master/Exceptions/ThrottleRequestsException.php
新建app/ExceptionsThrottleException.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 ($e instanceof ThrottleException) {
return response(['code' => $e->getCode(), 'msg' => $e->getMessage()], 429);
}
修改ThrottleRequests.php
的抛出:
throw new ThrottleException('Too Many Attempts.', 429);
注册中间件
在bootstrap/app.php
注册:
$app->routeMiddleware([
'throttle' => App\Http\Middleware\ThrottleRequests::class,
]);
至此我们就改造完成了,接下来就是使用了,方法很简单,在路由层添加'middleware' => 'throttle:5'
定义就可以了。具体的可以参考以下链接。
http://laravelacademy.org/post/3566.html