繁体   English   中英

在Laravel自定义中间件中设置Cookie

[英]Setting Cookie in Laravel Custom Middleware

我想在自定义Laravel中间件中设置一个cookie。 我们的想法是在用户通过任何目标网页访问我的网站时设置Cookie值。

所以我做的是创建了一个名为UUIDMiddleware的中间件。 我在我的路线中使用这个中间件和Web中间件。 以下是来自中间件的代码。

if($request->hasCookie('uuid'))
{
    return $next($request);    
}
else
{
    $uuid = Uuid::generate();
    $response = new Response();
    return $response->withCookie(cookie()->forever('uuid', $uuid));
}

如您所见,我正在检查cookie是否存在。 如果没有,我将控制传递给下一个请求。

问题是当使用return $response设置cookie时,我无法将控制传递给下一个请求。 我该如何解决这个问题?

在这种情况下会发生的情况是,如果没有设置cookie,它会设置一个cookie并显示一个空白屏幕。 如果我刷新,我会看到带有cookie集的网站。

必须有一种方法以正确的方式使用中间件设置cookie。 我该怎么做?

您可以在中间件中获取响应对象,如下所示:

public function handle($request, Closure $next)
{
    $response = $next($request);

    // Do something after the request is handled by the application

    return $response;
}

所以你可以这样做

if($request->hasCookie('uuid')) {
    return $next($request);    
}

$uuid = Uuid::generate();
$response = $next($request);
return $response->withCookie(cookie()->forever('uuid', $uuid));

如果你正在使用Laravel 5.8和我一样,你想要一个允许你设置cookie的过期时间而不是永久设置它的解决方案,你也可以在中间件中做这样的事情:

public function handle($request, Closure $next)
{
    $time = time() + 60 * 60 * 24; //One day
    $res = $next($request);
    return $res->cookie('cookie_name', $cookieValue, $time, "/");
} 

这将在控制器完成请求并设置响应时设置cookie。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM