如果会话存储在文件中,为啥仍然使用 cookie 来存储它们?
Posted
技术标签:
【中文标题】如果会话存储在文件中,为啥仍然使用 cookie 来存储它们?【英文标题】:if sessions are stored in files why are cookies still used to store them?如果会话存储在文件中,为什么仍然使用 cookie 来存储它们? 【发布时间】:2017-06-25 13:40:57 【问题描述】:客户:
start_session()
创建一个 cookie(默认):Name: phpSESSID; Content: 1q2w3e4r5t; Domain: '/'; Expires:...
服务器:
它还创建了一个存储在(我的案例)中的文件:/var/lib/php/sessions
。在那里打电话:sess_1q2w3e4r5t
。 (绝对路径:/var/lib/php/sessions/sess_1q2w3e4r5t
)
所以我们有两个物理的东西绑定到我刚刚创建的会话。
两者兼有有何意义?
无论use_only_cookies
选项如何,我都可以将我的会话存储在/var/lib/php/sessions
中吗?
我有一个带有$_SESSION['counter']
变量的经典示例。这意味着,每次我重新加载 example.php
页面时,$_SESSION['counter']
都会增加(++
)1。因此,在按下F5
按钮的循环中,假设我得到55
作为$_SESSION['counter']
的值。最后我是那个 cookie,但 不是 /var/lib...
文件。删除之后我得到一个 56
并且循环正常继续。这只是引起了我的兴趣并让我想到了这个问题。是否需要会话 cookie?
我的网站是否仍然可以只在服务器中存储会话而不使用 cookie?
这就是我删除 cookie 的方式。注意counter
的值为 69。
然后F5
:
【问题讨论】:
嗯?没有 cookie,您的所有请求都将是无状态的。 但是.. 就像我说的,在删除 cookie 之后,$_SESSION['counter']
仍然保持相同的值...如果我将其称为一种请求时,请纠正我
您是否混淆了删除 cookie 与删除会话或会话变量不同的事实?你必须在 PHP 中使用unset($_SESSION['counter'])
来失去它的价值。
好吧,最近我读到了cookies vs sessions 和this question。我意识到一个存储在服务器中,另一个存储在客户端。但是,仍然可能是我的网站仅在服务器中存储会话而不使用 cookie 的一种方式?
PHP 用于会话的 cookie 是 PHPSESSID
。 GLOBAL_SESS
一定是你在某处设置的。
【参考方案1】:
cookie 在那里,以便客户端可以告诉服务器哪个会话文件是他们的。 cookie 值对应于在服务器上创建的文件。
没有它,服务器只会为客户端创建一个新的会话文件,显然之前的请求中的任何数据都不会存在。
我只能想象你没有正确删除 cookie。
【讨论】:
我会标记会话文件以获取会话 ID:sess_ + 1q2w3e4r5t
。因此,不需要 cookie。
那么你怎么知道在两个后续请求中客户是否是同一个人呢?您只是在谈论服务器端的事情。客户端需要告诉服务器哪个会话是他们的。【参考方案2】:
同时拥有 session 和 cookie 的重点是上面的引用访问您网站的访问者被分配了一个唯一的 ID,即 所谓的会话ID。这要么存储在用户的 cookie 中 侧或在 URL 中传播。
简而言之:没有 cookie,客户端会变成陌生访客
【讨论】:
以上是关于如果会话存储在文件中,为啥仍然使用 cookie 来存储它们?的主要内容,如果未能解决你的问题,请参考以下文章
为啥 Django 不在 Varnish 代理后面生成 CSRF 或会话 Cookie?
Compojure/Ring:为啥与 cookie-store 的会话在服务器重新启动后无法幸存?