您好,登錄后才能下訂單哦!
本篇內(nèi)容主要講解“l(fā)aravel8怎么使用throttle中間件”,感興趣的朋友不妨來看看。本文介紹的方法操作簡(jiǎn)單快捷,實(shí)用性強(qiáng)。下面就讓小編來帶大家學(xué)習(xí)“l(fā)aravel8怎么使用throttle中間件”吧!
throttle 中間件介紹
頻率限制經(jīng)常用在 API 中,用于限制獨(dú)立請(qǐng)求者對(duì)特定 API 的請(qǐng)求頻率。每個(gè) API 都會(huì)選擇一個(gè)自己的頻率限制時(shí)間跨度,GitHub 選擇的是 1 小時(shí),Laravel 中間件選擇的是 1 分鐘。
例如:throttle:60,1,即設(shè)置頻率限制為每分鐘 60 次,如果一個(gè) IP 一分鐘內(nèi)超過這個(gè)限制,那么服務(wù)器就會(huì)返回 429 Too Many Attempts. 響應(yīng)。
在 laravel8 中使用 throttle 中間件
我們通常在這里一般會(huì)使用 throttle 中間件來做一個(gè)限定條件的速率限定,比如說不在 IP 白名單中的 IP 限制一分鐘訪問多少次。相對(duì)于之前來說,laravel8 中的 throttle 中間件,有了更簡(jiǎn)單的使用方法。
首先我們可以看到在 Kernel.php 文件中有這樣的定義
/**
* The application's route middleware groups.
*
* @var array<string, array<int, class-string|string>>
*/
protected $middlewareGroups = [
'web' => [
\App\Http\Middleware\EncryptCookies::class,
\Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
\Illuminate\Session\Middleware\StartSession::class,
// \Illuminate\Session\Middleware\AuthenticateSession::class,
\Illuminate\View\Middleware\ShareErrorsFromSession::class,
\App\Http\Middleware\VerifyCsrfToken::class,
\Illuminate\Routing\Middleware\SubstituteBindings::class,
],
'api' => [
// \Laravel\Sanctum\Http\Middleware\EnsureFrontendRequestsAreStateful::class,
'throttle:api',
\Illuminate\Routing\Middleware\SubstituteBindings::class,
],
];
/**
* The application's route middleware.
*
* These middleware may be assigned to groups or used individually.
*
* @var array<string, class-string|string>
*/
protected $routeMiddleware = [
'auth' => \App\Http\Middleware\Authenticate::class,
'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
'cache.headers' => \Illuminate\Http\Middleware\SetCacheHeaders::class,
'can' => \Illuminate\Auth\Middleware\Authorize::class,
'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class,
'password.confirm' => \Illuminate\Auth\Middleware\RequirePassword::class,
'signed' => \Illuminate\Routing\Middleware\ValidateSignature::class,
'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class,
'verified' => \Illuminate\Auth\Middleware\EnsureEmailIsVerified::class,
];
很明顯看到其實(shí) laravel8 中定義的'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class, 是框架已經(jīng)定義好的,并且在 api 中使用的是 throttle:api。
當(dāng)然,一般的大家的用法可能就是在這里把 throttle:api 注釋掉,新建一個(gè) throttle 中間件或者是在路由中可以直接使用 throttle:60,1 這樣的。
那如果是需要做一些復(fù)雜的判斷,比如說我有很多個(gè) IP 白名單想要排除掉,不做速率限制,或者是有個(gè) VVVIP 用戶不限制速率的時(shí)候怎么辦呢?
這時(shí),我們可以在 laravel8 中找到 App\Providers\RouteServiceProvider.php 文件,在文件最下面我們可以看到這樣的寫法
/**
* Configure the rate limiters for the application.
*
* @return void
*/
protected function configureRateLimiting()
{
RateLimiter::for('api', function (Request $request) {
return Limit::perMinute(60)->by(optional($request->user())->id ?: $request->ip());
});
}
這里定義的 api 就是上面在 Kernel.php 文件中所使用的的 throttle:api。在這里,我們可以設(shè)定自定義的速率限制條件,比如說限制用戶 IP 白名單之外的 IP 訪問限制為每小時(shí) 60 次,白名單每次可以訪問 1000 次
RateLimiter::for('apiHour', function (Request $request) {
if(!in_array($request->ip(), config('ip.whitelist'))){
return Limit::perHour(60)->by($request->ip());
}else{
return Limit::perHour(1000)->by($request->ip());
}
});
當(dāng)然別忘記在 config 文件夾中新建 ip.php 文件
return [
'whitelist' => [
'192.168.0.1',
],
];
:heart:溫馨提示:在使用的時(shí)候,用的是 api 接口路由的話,如果想使用自定義的 throttle:apiHour 不要忘記把原來 Kernel.php 中的 throttle:api 注釋掉喲!
最后我們就可以在路由中快樂的使用自定義的速率控制中間件了
Route::group([
'middleware' => ['throttle:apiHour']
], function ($router) {
Route::get('user', function (Request $request) {
return $request->user();
});
});
到此,相信大家對(duì)“l(fā)aravel8怎么使用throttle中間件”有了更深的了解,不妨來實(shí)際操作一番吧!這里是億速云網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。