laravel - 如何防止对 Laravel 的快速连续请求以加载缓存的数据库记录?
问题描述
我有一个快速点击用户导致中间件失败的问题。我很难在日志中发现错误,因此请参阅下面的一般描述。
设想
- 创建了一个用户。
- 用户导航到 /profile
- 中间件 hasAcceptedGDPR 重定向到路由 /acceptGDPRBeforeContinuing
- 在一个视图中 acceptGDPRBeforeContinuing 用户单击一个链接以路由 /acceptGDPR ,该链接设置 db 标志,指示用户确实已接受 gdpr 条款。
- 用户最终被重定向到 /profile
如果您缓慢单击,这可以正常工作。页面加载后点击接受的速度超过约 5 秒会再次触发中间件!这表明我缺少一些异步的东西或一些缓存?出于某种原因,第二次点击总是有效。
对于我的朋友来说,在闪亮的快速 mac 上一切正常,但对于我的慢速计算机来说,这是一个问题.. 有什么想法可以在这里测试吗?
控制器:
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use App\Http\Requests\UploadRequest;
use App\Pack;
use App\User;
use Auth;
class ProfileController extends Controller
{
public function __construct()
{
$this->middleware([
'auth'
]);
$this->middleware([
'hasAcceptedGDPR'
])->except([
'acceptGDPRBeforeContinuing', 'acceptGDPR'
]);
}
public function index() {
return view('profile');
}
public function acceptGDPRBeforeContinuing() {
return view('acceptGDPRBeforeContinuing');
}
public function acceptGDPR() {
$user = Auth::user();
$user->has_accepted_gdpr = true;
$user->save();
return redirect('/profile');
}
}
中间件:
<?php
namespace App\Http\Middleware;
use Closure;
use Auth;
class HasAcceptedGDPR
{
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @return mixed
*/
public function handle($request, Closure $next)
{
if(!Auth::user()->has_accepted_gdpr) {
return redirect('/acceptGDPRBeforeContinuing');
}
return $next($request);
}
}
路线:
Route::get('/profile', 'ProfileController@index');
Route::get('/acceptGDPRBeforeContinuing', 'ProfileController@acceptGDPRBeforeContinuing');
Route::get('/acceptGDPR', 'ProfileController@acceptGDPR');
看法:
<h3>Please accept our privacy police before continuing</h3>
<a href="{{url('/acceptGDPR')}}">I accept it.</a>
解决方案
推荐阅读
- python - How to combine only first and last column from each Excel sheet into new excel using panas in python?
- javascript - i++ 循环没有任何问题,i+2 无限循环并崩溃
- python - 如何使用 Selenium 和 Python 从定位的元素中抓取文本
- opencv - OpenCV ndarray image save fails after serialization
- javascript - Partial download of mp4 file with rn-fetch-blob, react-native-video throwing unrecognized error
- python - 如何在 Python 中嵌套列表理解
- mysql - 将数据保存在 JSON 中与 MySQL 中的独立列
- lua - io.popen 如何在 lua 中获取 go 输出
- ios - 在 Swift 中再次添加子视图时 UIViews 是否重复?
- python - 训练后如何使用 countVectorizer 测试新数据