<?php namespace App\Http\Middleware; use Closure; use Illuminate\Support\Facades\Redis; class CheckRequest { /** * Handle an incoming request. * * @param \Illuminate\Http\Request $request * @param \Closure $next * @return mixed */ public function handle($request, Closure $next) { $action = $request->route()->getAction(); // 获取路由信息 $routeActionName = ''; if (isset($action['controller'])) { $controller = class_basename($action['controller']); list($routeControllerName, $routeActionName) = explode('@', $controller); } $prevent_resubmit = Config('config.prevent_resubmit_api'); // 防止重复提交接口 // 对AJAX POST请求添加Redis锁,防止重复提交 if (in_array($routeActionName, $prevent_resubmit) && $request->ajax() && $request->isMethod('post')) { $referer = $_SERVER['HTTP_REFERER']; // 来源页面 $sale_id = $request->user->userId; // 操作人ID $key = $routeActionName.'_'.md5($referer.'/'.$sale_id); // 设置表单页面key // Redis::incr($key); // 计数器 // $count = Redis::get($key); // if ($count > 1) return abort(501, '请勿重新提交!'); // 501服务器不支持当前请求 $lock = Redis::set($key, 1, "nx", "ex", 2); // 2秒内重复点击提交按钮无效 if (!$lock) return abort(501, '请勿重新提交!'); $response = $next($request); return $response; } return $next($request); } }