Laravel 路由:访问控制(节流) Draft
在Laravel中,可以使用路由访问控制(节流)来限制用户在一定时间内对特定路由的访问次数。以下是一个使用路由中间件来实现访问控制的示例:
首先,创建一个中间件:
// 使用 `artisan` 命令创建中间件
php artisan make:middleware ThrottleMiddleware
编辑创建的中间件(位于 app/Http/Middleware/ThrottleMiddleware.php
):
namespace App\Http\Middleware;
use Closure;
use Illuminate\Http\Request;
use Illuminate\Cache\RateLimiting\Limit;
use Illuminate\Support\Facades\RateLimiter;
class ThrottleMiddleware
{
/**
* 处理传入的请求。
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @return mixed
*/
public function handle(Request $request, Closure $next, $maxAttempts = 60, $decayMinutes = 1)
{
$key = $this->getCacheKey($request);
if (! RateLimiter::tooManyAttempts($key, $maxAttempts)) {
RateLimiter::hit($key, $decayMinutes);
return $next($request);
} else {
return response(["message" => "Too Many Attempts."], 429);
}
}
/**
* 获取用于缓存的键。
*
* @param \Illuminate\Http\Request $request
* @return string
*/
protected function getCacheKey(Request $request)
{
return 'throttle:' . $request->user()->id . '|' . $request->ip();
}
}
然后,将中间件注册到 app/Http/Kernel.php
的 $routeMiddleware
数组中:
protected $routeMiddleware = [
// ...
'throttle' => \App\Http\Middleware\ThrottleMiddleware::class,
];
最后,使用中间件保护路由:
Route::middleware('throttle:60,1')->group(function () {
Route::get('/high-traffic-route', function () {
// 只有在访问频率低于每分钟60次的情况下,用户才能访问这个路由
});
});
这个例子中,我们定义了一个名为 throttle
的中间件,它限制了每分钟60次的请求。如果用户超过这个频率,将会收到一个429状态码的响应。这种方式可以用来防止自动化脚本或攻击性的请求对应用造成的影响。
评论已关闭