<?php
namespace App\Http\Middleware;
use Closure;
use Illuminate\Routing\Middleware\ThrottleRequests;
use Symfony\Component\HttpKernel\Exception\TooManyRequestsHttpException;
class ThrottleRequestByIP extends ThrottleRequests
{
/**
* @param \Illuminate\Http\Request $request
* @param Closure $next
* @param int $maxAttempts
* @param int $decayMinutes
* @param int $LockMinutes
* @return \Illuminate\Http\Response
*/
public function handle($request, Closure $next, $maxAttempts = 60, $decayMinutes = 1, $LockMinutes = 0)
{
$key = $this->resolveRequestSignature($request);
if(!$LockMinutes)$LockMinutes = $decayMinutes;
if ($this->limiter->tooManyAttempts($key, $maxAttempts, $LockMinutes)) {
throw new TooManyRequestsHttpException($this->limiter->availableIn($key),'该ip请求频繁,已被锁定,请在'.$this->limiter->availableIn($key).'秒后重试');
}
$this->limiter->hit($key, $decayMinutes);
$response = $next($request);
return $this->addHeaders(
$response, $maxAttempts,
$this->calculateRemainingAttempts($key, $maxAttempts)
);
}
/**
* Resolve request signature.
*
* @param \Illuminate\Http\Request $request
* @return string
*/
protected function resolveRequestSignature($request)
{
return 'ThrottleIP|'.$request->ip();
}
}