【问题标题】:Laravel App performs two requests, but the second unwantedLaravel 应用程序执行两个请求,但第二个不需要
【发布时间】:2018-11-06 10:32:34
【问题描述】:

我发现,我的 Laravel (5.7) 应用在某些情况下会出现奇怪的行为,即它会执行两个表单提交请求。上周一切正常。

例如:有一个注册表。当用户想要注册并提交表单时,他无法通过验证,因为输入的电子邮件地址已经存在(在他提交表单之前它并不正确)。在我的数据库中一目了然,显示用户已创建并已登录。因此,表单似乎以某种方式执行了两个请求。

此行为发生在整个应用程序的多个表单上,但并非全部发生。这会导致一些非常糟糕的操作(上面的一个,电子邮件发送两次,图像上传两次等)。

一个可能的问题原因可能是一个新的中间件,我在其中访问当前请求并对其执行一些操作:

class CookiebannerMiddleware
{
    public function handle(Request $request, Closure $next)
    {
        $cookie_name = config('cookiebanner.cookie_key');
        $cookie_value = config('cookiebanner.cookie_value');
        $cookie_lifetime = config('cookiebanner.cookie_lifetime');

        $response = $next($request);

        if(!$request->hasCookie($cookie_name)){
            $response->cookie($cookie_name, $cookie_value, $cookie_lifetime);
            return $response;
        }

        return $next($request);
    }
}

或者还有其他可能导致此类问题的可能性吗?


更新

问题是我的 CookiebannerMiddleware。问题通过以下解决方案得到解决:

class CookiebannerMiddleware
{
    public function handle(Request $request, Closure $next)
    {

        $cookie_name = config('cookiebanner.cookie_key');
        $cookie_value = config('cookiebanner.cookie_value');
        $cookie_lifetime = config('cookiebanner.cookie_lifetime');

        if(!$request->hasCookie($cookie_name)){
            return $next($request)->withCookie($cookie_name, $cookie_value, $cookie_lifetime);
        }

        return $next($request);
    }
}

【问题讨论】:

  • 你确定它只有一个请求访问 laravel 吗?客户端有什么问题吗?你可以在本地复制它吗? 看来,表单以某种方式执行了两个请求。这部分让我觉得有人点击了表单提交按钮两次。
  • 这是个问题,我在本地发现的。而且我 100% 只点击了一次提交按钮;)
  • @Brotzka 你的网络标签(启用Preserve log)只显示一个请求?
  • @TravisBritz 问题出在我的中间件上。我已经更新了我的问题。看来我已经提交了两次请求。我不知道如何,但上面的更新解决了这个问题。

标签: php laravel laravel-5 request


【解决方案1】:

避免两次调用$next($request)

class CookiebannerMiddleware
{
    public function handle(Request $request, Closure $next)
    {
        $cookie_name = config('cookiebanner.cookie_key');
        $cookie_value = config('cookiebanner.cookie_value');
        $cookie_lifetime = config('cookiebanner.cookie_lifetime');

        $response = $next($request);

        if(!$request->hasCookie($cookie_name)){
            $response->cookie($cookie_name, $cookie_value, $cookie_lifetime);
        }

        return $response;
    }
}

【讨论】:

  • 太好了,奋斗了很久,谢谢
【解决方案2】:

你打了两次电话

$response = $next($request);

你应该这样做

    $response = $next($request);
    if(!$request->hasCookie($cookie_name)){
        $response->cookie($cookie_name, $cookie_value, $cookie_lifetime);
    }
    return $response;

【讨论】:

  • 是的,这似乎是问题所在。但是如何在不执行第二个请求的情况下访问当前请求和响应?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-12
  • 1970-01-01
  • 2023-03-22
  • 1970-01-01
相关资源
最近更新 更多