代码之家  ›  专栏  ›  技术社区  ›  ajthinking

如何防止快速连续请求Laravel加载缓存的数据库记录?

  •  1
  • ajthinking  · 技术社区  · 6 年前

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

    脚本

    • 创建一个用户。
    • 用户导航到/profile
    • 中间件hasAcceptedGDPR在继续之前重定向到route/AcceptGDPr
    • 在“接受gdpr”视图中,在继续之前,用户单击指向route/acceptGDPR的链接,该链接设置db标志,指示用户确实接受了gdpr条款。
    • 用户最终被重定向到/profile

    如果你慢慢点击,效果很好。页面加载后,点击accept(接受)的速度超过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>
    
    0 回复  |  直到 4 年前