Laravel实战之请求频率限制(Throttle中间件)

Laravel框架
819
1
1
2023-02-05

为防止网站或API被频繁请求或被DDoS攻击,需要设置请求限制,而Laravel刚好自带个Throttle中间件,使用起来也非常方便。

1. 需在App\Http\Kernel里加入配置 throttle:20,1,如下图

20代表请求次数,1代表每分钟,可以根据自身需求自行设置,设到满意为止。

这样其实就可以限制被频繁访问了,不过显示的429页面确实有点丑,感觉看不下去,如下图:

那如何改成好看点呢。

2. 只需要在App\Exceptions\Handler加入如下代码即可

/**
 * Register the exception handling callbacks for the application.
 *
 * @return void
 */
public function register()
{
    $this->reportable(function (Throwable $e) {
        //
    });

    $this->renderable(function (Throwable $e) {
        if ($e instanceof ThrottleRequestsException) {
            $limitTime = $e->getHeaders()['Retry-After'];
            $code = $e->getStatusCode();
            return response()->view('error', ['time_limit'=>$limitTime], $code);
            //假如ajax,可以用json返回//return response()->json([...]);
        }
    });
}

然后再看下效果,比之前好多了,界面可自行优化下。

还有个问题,那如果你只想限制游客,并不想限制登录用户,那又改怎么做呢?

3. 再App\Http\Kernel里替换掉原生的ThrottleRequests,再建一个新的覆盖即可,如下图:

ThrottleRequestsLimit的代码如下:

<?php
namespace App\Http\Middleware;

use Illuminate\Routing\Middleware\ThrottleRequests;
use Closure;
use Illuminate\Support\Facades\Auth;

class ThrottleRequestsLimit extends ThrottleRequests
{
    protected function handleRequest($request, Closure $next, array $limits)
    {
        if (Auth::check()) {
            //not limit auth userreturn $next($request);
        } else {
            return parent::handleRequest($request, $next, $limits);
        }
    }
}

当然laravel还有个RateLimiter可以用,下期再分享。