我想在laravel blade.php文件中设置cookie,而不是在控制器中。我该怎么设置呢?
发布于 2022-09-07 19:30:57
免责声明:我将把我的答案集中在PHP和laravel上。
为什么不设控制器呢?
了解为什么不能/或不希望在控制器中使用拉拉维尔饼干面设置cookie确实会有所帮助-例如。Cookie::queue
,因为它很容易做到!
这里有两种方法,来自本源。
通过响应:
return response(view('welcome'))->cookie('name','value',$min);
通过队列:Cookie::queue(Cookie::make('name','value',$min)); return view('welcome');
设置-琦琦是一个响应头,而不是身体!
假设您要在中设置这些cookie,它们需要作为响应头的一部分,而不是主体(视图)的一部分。这就是为什么您需要在控制器中设置这些,在控制器中发送响应!
如果尝试使用PHP函数设置cookie,则会遇到“已发送标头”的错误。
根据文档:https://www.php.net/setcookie
setcookie()定义了要与其他HTTP标头一起发送的cookie。与其他标头一样,必须在脚本的任何输出(这是协议限制)之前发送cookie。这要求在输出之前调用该函数,包括和标记以及任何空格。
要理解这意味着什么,了解requests和responses的结构是有帮助的
请求、和响应由头、和可能的主体组成。
请求头类似于有关请求的元数据,它可以告诉服务器请求的内容类型,以及请求的对象。
响应头类似于有关返回的响应的元数据,它可以告诉服务器正在传递什么类型的内容,为其缓存多长时间,以及设置了关联的cookie。
示例请求标头:
Content-Type: 'application/json'
Content-Type: 'application/pdf'
Content-Type: 'text/html'
Content-Type: 'text/css'
User-Agent: 'Mozilla/5.0 (<system-information>) <platform> (<platform-details>) <extensions>'
Authorization: 'Bearer <token>'
示例响应标头:
Content-Type
,因为它可能与请求的内容不同Expires: 'Wed, 07 Sep 2022 19:26:49 GMT'
Cross-Origin-Resource-Policy: 'cross-origin'
Date: 'Wed, 07 Sep 2022 19:26:49 GMT'
Content-Length: 0
,Set-Cookie: test_cookie=CheckForPermission; expires=Wed, 07-Sep-2022 19:41:49 GMT; path=/; domain=.doubleclick.net; Secure; HttpOnly; SameSite=none
注意:- Set-Cookie
-告诉浏览器将这些cookie添加到应用程序存储中(您可以在开发工具中的应用程序/存储选项卡中查看这些cookie)
响应头可以有Set-Cookie
,而不是请求头。这是有意义的,因为通常情况下,cookie信息将来自对“问题”(请求)的“答案”(响应),通过执行一些逻辑,例如-这个用户是经过身份验证的,这里有一个cookie来保持他们的会话正常。
还有:安全& HTTP专用Cookies
可以通过一些选项来设置Cookies -仅限安全性,而仅限http。这意味着cookie必须在安全连接(https)上设置,并且http只能来自响应,不能被JavaScript调整(客户端)覆盖。
Laravel的Cookie::queue facade选项示例:
// $name, $value, $minutes = 0, $path = null, $domain = null, $secure = false, $httpOnly = true
Cookie::queue($name, $value, $ttl, $path, $domain, $secure, $httpOnly);
ttl =“生存的时间”,或它到期的时间。2分钟
https://stackoverflow.com/questions/73604687
复制相似问题