Rails 中会话的工作原理

How session works in Rails

我在 rails 了解会话。大部分参考资料都是这么说的,下面是创建session的方法。

示例:

session[:id]=user.id

会话是一个全局哈希。我的疑问是,如果会话是全局哈希,那么如果有多个用户尝试登录,则会话变量会获取 覆盖与否?因为,将只有一个全局哈希。因此,如果数百万用户登录,那么 "session[:id]" 如何保持不变 所有用户会话。是否可以在一个变量中存储多个值。以及如何删除特定会话 用户。那么,rails?

中的会话是如何处理的

Most applications need to keep track of certain state of a particular user. This could be the contents of a shopping basket or the user id of the currently logged in user...Rails will create a new session automatically if a new user accesses the application. It will load an existing session if the user has already used the application.

A session usually consists of a hash of values and a session id, usually a 32-character string, to identify the hash. Every cookie sent to the client's browser includes the session id. And the other way round: the browser will send it to the server on every request from the client.

http://guides.rubyonrails.org/security.html

换句话说,每个唯一用户都有自己的会话哈希。 "Global" 表示可以在任何 action/method.

内访问会话哈希

正如 7stud 所说,所有会话都是按用户创建的。由于 HTTP 是一种 "stateless" 协议,您可能需要有人在每次他们想要查看新页面甚至刷新现有页面时输入他们的登录信息。这就是会话的用武之地。在 Rails 中,每个会话在创建时都会分配一个唯一的会话 ID(一个 32 个随机十六进制数字的字符串),然后将包含此 ID 的 cookie 发送到客户端的浏览器。从那时起,来自浏览器的每个请求都会将会话 ID 发送回服务器,从而保持连续性。要遵循的正常准则是您应该只跟踪会话中的最低限度,例如用于确定当前用户的信息(如主键等)。

session 不是全局哈希。这是一种在每个请求的上下文中 returns 新散列的方法。该哈希的创建方式取决于底层会话存储。

让我们来看看 2 个典型的会话存储。

加密的 cookie 存储

这是 Rails 应用程序的默认会话存储。 Rails 序列化然后将整个会话哈希加密为 cookie,并将这些 cookie 存储在客户端(例如浏览器)上。每次请求命中 Rails 应用程序时,Rails 解密然后将该会话 cookie 反序列化为哈希。该散列就是方法 session returns.

Redis 会话存储

此会话存储未随 Rails 一起提供。这是一个单独的 gem.

有了这个会话存储,Rails 序列化会话,给它一个 ID(称为会话 ID),并将 ID-哈希对存储到 Redis 中。 Rails 然后将会话 ID 设置为 cookie,并将该 cookie 发送给客户端。每次请求到达 Rails 应用程序时,Rails 从 cookie 中检索会话 ID,从 Redis 获取与该会话 ID 关联的序列化会话,并将其反序列化为哈希。该散列就是方法 session returns.