为什么 Rails 对同一会话的每个请求都更改 Set-Cookie 标头

Jia*_*ang 5 ruby cookies session rack ruby-on-rails

我将 Rails 4 与基于 cookie 的会话存储一起使用,发现每次刷新页面时 Rails 4 都会给我一个不同的 cookie,但它仍然可以识别我。

将它与另一个使用 的机架应用程序进行比较Rack::Session::Cookie,它只会发送Set-Cookie第一个请求,直到对会话数据进行了一些更改。

为什么它们的设计不同?背后有什么原因吗?

geo*_*ock 3

这是因为 Rails 处理会话存储和 cookie 加密的方式:

  1. 默认会话存储将尝试在任何访问会话的请求上将会话数据写入加密的 cookie(无论是读取还是写入),
  2. 即使纯文本值没有改变,加密值也会改变,
  3. 加密发生在到达负责检查 cookie 值是否已更改以避免冗余Set-Cookie标头的代码之前。

我在回答这个问题时更详细地介绍了:为什么 Rails 不断发回 Set-Cookie 标头?