会话如何在Rails中工作

时间:2016-09-20 18:42:31

标签: ruby-on-rails ruby ruby-on-rails-4 session session-cookies

我了解rails中的会话。大多数参考文献都说,以下是创建会话的方法。

示例:

session[:id]=user.id

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

3 个答案:

答案 0 :(得分:6)

session不是全局哈希。它是一种在每个请求的上下文中返回新哈希的方法。如何创建哈希取决于底层会话存储。

让我们来看看2个典型的会话商店。

加密的Cookie商店

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

Redis会话商店

此会话存储不随Rails一起提供。它是一个独立的宝石。

使用此会话存储,Rails序列化会话,为其提供ID(称为会话ID),并将ID哈希对存储到Redis中。然后Rails将会话ID设置为cookie并将该cookie发送给客户端。每次请求到达Rails应用程序时,Rails都会从cookie中检索会话ID,从Redis获取与该会话ID关联的序列化会话,并将其反序列化为哈希。该哈希是方法session返回的内容。

答案 1 :(得分:1)

  

大多数应用程序需要跟踪特定的某些状态   用户。这可以是购物篮的内容或用户ID   当前登录用户...如果是新用户,Rails将自动创建一个新会话   访问应用程序。如果用户,它将加载现有会话   已经使用过该应用程序。

     

会话通常由值的哈希值和会话ID组成,   通常是一个32个字符的字符串,用于标识哈希值。发送的每个cookie   到客户端的浏览器包括会话ID。另一种方式   round:浏览器会在每次请求时将其发送到服务器   客户。

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

换句话说,每个唯一用户都有自己的会话哈希。 "全球"意味着可以在任何操作/方法中访问会话哈希。

答案 2 :(得分:0)

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