Rails v2.3:会话和cookie之间的区别

时间:2011-10-12 16:11:14

标签: ruby-on-rails ruby-on-rails-3 ruby-on-rails-3.1

我正在通过阅读在线指南(适用于Rails v2.3 )学习Rails。指南很棒,然而,对我来说有一个混乱,那就是:

有一章解释了Rails的Session,另一章解释了Rails的Cookies。解释很容易理解,但比较两者时,像我这样的读者并没有看到Session和Cookies之间的显着差异。特别是应该使用哪种情况会话以及在哪种情况下应该使用Cookie?

此外,在会话章节中,有一个CookieStore的概念,那么CookieStore和Cookies有什么区别?

有人可以向我解释这些吗?

4 个答案:

答案 0 :(得分:24)

会话& Cookie既能够在两个或多个请求之间存储一些信息(例如:current_user id),这些请求(在http中)也是无状态的。

但Session更像是一个与特定时间内处于特定状态的概念相关的抽象概念:它包含的信息可以存储在数据库中,服务器端文件中,以redis散列< strong> OR中的Cookie 。

Cookie始终是导航器必须在请求之间存储一些持久数据的小文本文件...但是在客户端有一些数据可能是不安全的,这就是为什么它经常被加密。但是这个概念确实可以与会话重叠。

TL; DR:会话保存临时数据的抽象概念。 Cookies一种(常见的)方式。

答案 1 :(得分:8)

Cookie是存储在浏览器中的小文本文件。

会话是“正在使用”状态的概念,该状态可以包含与之关联的数据。 Rails使用cookie跟踪会话,并允许您为关联数据选择不同的存储,并使用相同的session接口访问它。

CookieStore表示所有会话信息都存储在cookie本身内。您可以选择在适当的地方使用其他各种商店,并且仍然可以使用session访问者方法。

除会话外,您还可以设置其他Cookie以在用户的​​浏览器上存储信息。它们与会话无关,可以单独设置,访问和删除。

示例1,在会话中存储登录用户的购物车:

session[:embarassing_products] = ['ooh',
                                  'naughty',
                                  'lucky_im_using_activerecord_store',
                                  'only_the_session_id_is_in_the_cookie',
                                  'other_data_arent_in_the_browser']

为用户的会话保留购物车。您可以将会话设置为在浏览器窗口关闭,用户注销或经过一定时间后结束。

示例2,记住浏览器在cookie中对您的域的最后语言首选项:

cookie[:lang] = 'en-US'

此信息存储在cookie本身内。除非cookie过期或被删除(由您或用户删除),否则它将保留在浏览器中。

答案 2 :(得分:6)

对我来说,主要区别在于会话数据存储在服务器上,而cookie存储在客户端(浏览器)上。

因此您可以信任会话中的数据。来自cookie的信息可以被操纵,被盗,因此不应该被用于关键用途(例如,对于正确的访问)。

第二点,Cookie的大小有限,并且只是基于文本的。您可以在会话中存储许多复杂的对象(但要注意内存消耗),并且您不必将它们传输到客户端,然后在每次请求时返回。

答案 3 :(得分:3)

通常会话只会持续到用户关闭浏览器。这对于典型的登录非常有用。然而,如果您需要在会话之间保留信息,则可以使用持续时间较长的cookie,例如即使在重新启动浏览器后仍然存在的“记住我”标记。