首頁 > php框架 > Laravel > 如何在Laravel中使用中間件進行請求限流

如何在Laravel中使用中間件進行請求限流

王林
發布: 2023-11-03 18:16:47
原創
982 人瀏覽過

如何在Laravel中使用中間件進行請求限流

如何在Laravel中使用中間件進行請求限流

#引言:
在我們開發Web 應用程式時,經常會遇到需要對使用者的請求進行限制的情況,例如,限制每分鐘只能發送一定數量的請求,或限制某個介面的並發請求數量等。在 Laravel 框架中,我們可以透過中介軟體來實現請求的限流。本文將介紹如何使用中間件來進行請求限流,並提供對應的程式碼範例。

一、理解中間件和請求限流
中間件(Middleware)是Laravel 提供的一種機制,它可以在請求處理的各個階段介入,並對請求進行處理、過濾或增強。請求限流是一種限制使用者請求頻率或請求數量的機制,通常用於控制資源的存取速度和保護伺服器的穩定性。

二、建立限流中間件
在Laravel 中,可以透過Artisan 指令來建立一個中間件:
php artisan make:middleware ThrottleRequests

#產生的中間件檔案位於app/Http/Middleware 目錄下,例如:ThrottleRequests.php
接下來,我們需要在中間件的handle 方法中實作請求限流的邏輯,例如下面這段程式碼:

<?php

namespace AppHttpMiddleware;

use Closure;
use IlluminateCacheRateLimiter;
use SymfonyComponentHttpFoundationResponse;

class ThrottleRequests
{
    protected $limiter;

    public function __construct(RateLimiter $limiter)
    {
        $this->limiter = $limiter;
    }

    public function handle($request, Closure $next, $maxAttempts = 60, $decayMinutes = 1)
    {
        $key = $request->ip(); // 使用 IP 地址作为限流的关键字
        if ($this->limiter->tooManyAttempts($key, $maxAttempts)) {
            return new Response('Too Many Attempts.', 429);
        }

        $this->limiter->hit($key, $decayMinutes * 60);

        return $next($request);
    }
}
登入後複製

在上述程式碼中,我們使用了Laravel框架內建的RateLimiter 類別來實現請求限流的功能。 TooManyAttempts 方法用於判斷請求是否超過了最大允許數量,如果是則傳回 429 狀態碼;hit 方法用於記錄請求的次數,並設定時間視窗的長度。

三、註冊中間件
要讓我們建立的中間件生效,需要在app/Http/Kernel.php 檔案中的$middleware 陣列中註冊中間件。找到該檔案並添加以下程式碼:

protected $routeMiddleware = [
    // ...
    'throttle' => AppHttpMiddlewareThrottleRequests::class,
];
登入後複製

四、使用中間件進行請求限流
透過上述步驟,我們已經成功創建了一個請求限流的中間件,並完成了中間件的註冊。接下來,我們可以在路由定義或控制器中使用該中間件了。

  1. 在路由定義中使用中間件:

    Route::middleware('throttle:10,1')->get('/test', function () {
     return 'Hello, Laravel!';
    });
    登入後複製

    上述程式碼中,我們將throttle 中介軟體套用到/test 路由,每分鐘最多允許10 次請求,並且在達到最大請求次數後,使用者將會收到429 個狀態碼。

  2. 在控制器中使用中間件:

    class TestController extends Controller
    {
     public function __construct()
     {
         $this->middleware('throttle:10,1');
     }
    
     public function index()
     {
         return 'Hello, Laravel!';
     }
    }
    登入後複製

    #透過上述程式碼,我們將throttle 中間件套用於TestController 控制器中的index 方法。

    總結:
    本文介紹如何在 Laravel 中使用中間件來進行請求限流,並提供了對應的程式碼範例。透過使用限流中間件,我們可以靈活控制使用者請求的頻率和數量,從而保護伺服器的穩定性和安全性。在實際的 Web 開發中,請求限流是一項非常重要的技術,希望這篇文章能對大家有幫助。結束

    以上是如何在Laravel中使用中間件進行請求限流的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
最新問題
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板