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

时间:2018-05-23 16:36:19

标签: laravel caching middleware

我遇到快速点击用户导致中间件失败的问题。我很难在日志中捕获错误,因此请参阅下面的一般说明。

方案

  • 创建了一个用户。
  • 用户导航至/ profile
  • 中间件hasAcceptedGDPR重定向到route / acceptGDPRBeforeContinuing
  • 在视图中,acceptGDPRBeforeContinuing用户单击route / 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>

0 个答案:

没有答案