登峰造极境

  • WIN
    • CSharp
    • JAVA
    • OAM
    • DirectX
    • Emgucv
  • UNIX
    • FFmpeg
    • QT
    • Python
    • Opencv
    • Openwrt
    • Twisted
    • Design Patterns
    • Mysql
    • Mycat
    • MariaDB
    • Make
    • OAM
    • Supervisor
    • Nginx
    • KVM
    • Docker
    • OpenStack
  • WEB
    • ASP
    • Node.js
    • PHP
    • Directadmin
    • Openssl
    • Regex
  • APP
    • Android
  • AI
    • Algorithm
    • Deep Learning
    • Machine Learning
  • IOT
    • Device
    • MSP430
  • DIY
    • Algorithm
    • Design Patterns
    • MATH
    • X98 AIR 3G
    • Tucao
    • fun
  • LIFE
    • 美食
    • 关于我
  • LINKS
  • ME
Claves
长风破浪会有时,直挂云帆济沧海
  1. 首页
  2. Programming
  3. Laravel
  4. 正文

Laravel 访问频率限制中间件throttle-日常笔记

2017-10-12

使用Laravel编写的API提示“429 Too Many Requests laravel”错误。经过谷歌得知Laravel throttle中间件可以限制Api请求次数。

1、访问频率限制概述

频率限制经常用在API中,用于限制独立请求者对特定API的请求频率。例如,如果设置频率限制为每分钟1000次,如果一分钟内超过这个限制,那么服务器就会返回 429: Too Many Attempts.响应。

通常,一个编码良好的、实现了频率限制的应用还会回传三个响应头: X-RateLimit-Limit, X-RateLimit-Remaining和 Retry-After(如果达到限制次数只能获取到 Retry-After头)。 X-RateLimit-Limit告诉我们在指定时间内允许的最大请求次数, X-RateLimit-Remaining指的是在指定时间段内剩下的请求次数, Retry-After指的是距离下次重试请求需要等待的时间(s)。

注意:每个API都会选择一个自己的频率限制时间跨度,GitHub选择的是1小时,Twitter选择的是15分钟,Laravel中间件选择的是1分钟。

2、如何使用Laravel的访问频率限制中间件

在Laravel 5.2的新特性中,你可以使用一个新的中间件 throttle,让我们先来看看这个中间件的用法,首先我们定义一个路由规则如下:

Route::group(['prefix'=>'api'],function(){
    Route::get('users',function(){
        return AppUser::all();
    });
});

然后我们将中间件throttle添加到其中,throttle默认限制每分钟尝试60次,并且在一分钟内访问次数达到60次后禁止访问:

Route::group(['prefix'=>'api','middleware'=>'throttle'],function(){
    Route::get('users',function(){
        return AppUser::all();
    });
});

如果你访问api/users路由,就会看到响应头如下所示:

 

该响应意味着:

  • 请求成功(状态码为200)
  • 每分钟只能访问60次
  • 在本时间段内还能访问57次

如果访问次数超过60次,响应头如下:

 

同时,响应内容文本为:Too Many Attempts。

如果44s后重试,页面恢复正常访问。

3、自定义throttle中间件

让我们来做一点自定义,现在我们想要限制每分钟访问5次:

Route::group(['prefix'=>'api','middleware'=>'throttle:5'],function(){
    Route::get('users',function(){
        return AppUser::all();
    });
});

如果我们想要改变达到指定限制次数后的等待时间,可以这样自定义:

Route::group(['prefix'=>'api','middleware'=>'throttle:5,10'],function(){
    Route::get('users',function(){
        return AppUser::all();
    });
});

4、关闭访问频率限制

如果想关闭限制,注释掉app/Http/Kernel.php相应代码即可。

    protected $middlewareGroups = [
        'web' => [
            AppHttpMiddlewareEncryptCookies::class,
            IlluminateCookieMiddlewareAddQueuedCookiesToResponse::class,
            IlluminateSessionMiddlewareStartSession::class,
            // IlluminateSessionMiddlewareAuthenticateSession::class,
            IlluminateViewMiddlewareShareErrorsFromSession::class,
//            AppHttpMiddlewareVerifyCsrfToken::class,
            IlluminateRoutingMiddlewareSubstituteBindings::class,
        ],

        'api' => [
           // 'throttle:60,1',
            'bindings',
        ],
    ];

参考文献


http://laravelacademy.org/post/3566.html

-

标签: 暂无
最后更新:2017-10-12

代号山岳

知之为知之 不知为不知

点赞
< 上一篇

COPYRIGHT © 2099 登峰造极境. ALL RIGHTS RESERVED.

Theme Kratos Made By Seaton Jiang

蜀ICP备14031139号-5

川公网安备51012202000587号