PHP中的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)

抛出相应

Throttle超过限制的次数抛出的是 Illuminate\Http\Exceptions\ThrottleRequestsException ,Lumen框架缺少该异常相应的文件,同样我们需要自己定义,可以参考该源文件:

新建 app/ExceptionsThrottleException.php 文件,复制以下代码:

在 app/Exceptions/Handler.php 捕获该抛出异常,在render方法增加以下判断:

if ($e instanceof ThrottleException)

修改 ThrottleRequests.php 的抛出:

throw new ThrottleException('Too Many Attempts.', 429);

注册中间件

在 bootstrap/app.php 注册:

$app->routeMiddleware(['throttle' => App\Http\Middleware\ThrottleRequests::class,]);

至此我们就改造完成了,接下来就是使用了,方法很简单,在路由层添加

'middleware' => 'throttle:5'

定义就可以了。

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20181023A1Y3Q500?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。

扫码关注云+社区

领取腾讯云代金券