首页 > 解决方案 > 如何防止对 Laravel 的快速连续请求以加载缓存的数据库记录?

问题描述

我有一个快速点击用户导致中间件失败的问题。我很难在日志中发现错误,因此请参阅下面的一般描述。

设想

如果您缓慢单击,这可以正常工作。页面加载后点击接受的速度超过约 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>

标签: laravelcachingmiddleware

解决方案


推荐阅读