session (cookies flash) 的本质是什么?
这个问题并不是代码或异常方面的问题,而是理解方面的问题(我在网上查了相关问题,都是使用或用途方面的)。
如果这其中有我个人知识边界上的缺陷,或者大家觉得要把这个问题讲清楚会很绕,我很抱歉打扰大家,这个问题不论是问还是答都会很绕,如果大家能为我解释清楚,非常感谢。
我在学习ROR tutorial 这套教程中知道如何使用
cookies
和
session
,可是我并不明白这两个东东的实质,我并不是说它们用来干什么,而是它们是什么,tutorial只说它们是对象。
在用户登录这一节,写
sign_in
方法的时候,特别说明s
elf.current_user
这里一定要加
self
,如果写成
current_user = user
, 解释器会把它理解为一个局部变量的赋值,那么其它地方就使用不了
current_user
(自己的理解),所以
self.current_user = user
这句实际上不是一个赋值,而是一个方法调用,是调用了
current_user=(user)
这个赋值方法,而最终本质是,给
@current_user
这个实例变量赋值,这句用以下三个注释中的任何一句代替都是等价的。
def sign_in(user)
remember_token = User.new_remember_token
cookies.permanent[:remember_token] = remember_token
user.update_attribute(:remember_token, User.hash(remember_token))
# self.current_user = user
# current_user=(user)
# @current_user = user
current_user=(user)
end
那么,相对于
current_user
,
cookies
和
session
是什么呢,它们也可以在其它方法中调用(如下面平日练习代码),那么它们一定不是局部变量,但它们应该也不是实力变量,因为它们前面没有@,Tutorial里说它们是对象,那它们应该是某个类的实例,就像
@user = User.new
但它们前面没有@, 那会不会类似
user = User.new
但这个实例化的对象赋给了一个局部变量,那么他应该是不能在其它方法中使用的,但如下代码所示,它们可以在其它方法中使用。后来我查了Rails API, API的解释如下,其实这个定义的方法我也不太懂,不过我理解到(不知是否正确)
session
其实是个方法,是个类
current_user
这样的,可以赋值,可以取值, 但是
session[:return_to]
这样的写法又让我迷惑了, 如果是方法的话还可以这样写么,如果是hash对象就可以这样写,但如果十个hash变量,这就是个局部的,其它方法就不能调用了(我这样理解),所以我觉得很疑惑,session和 cookies这类东西本质是什么,虽然我会用,但是理解上很模糊
session() Link
Source: hide | on GitHub
# File actionpack/lib/action_dispatch/testing/test_process.rb, line 13
def session
@request.session
end
#平日练习里的代码
def redirect_back_or(default)
redirect_to(session[:return_to] || default)
session.delete(:return_to)
end
def store_location
session[:return_to] = request.fullpath if request.get?
end
method ruby-on-rails cookies hash
Answers
对于 web 开发 cookie, session 是通用的,不管你是 java 还是 rails。 cookie 大家都知道他是存储在浏览器上的。而 session 可已理解为一个用户访问网站期间,服务器存储关于这个用户的信息,用户之间是隔离的。 session 的存储是由 服务端 负责的,一般都是利用 cookie 在浏览器存一个 session_id,然后每次请求根据这个 session_id 查找对应的 session。
让你混淆的原因可能是,默认 rails 的 session 存储是利用 cookie 存储 http://guides.ruby-china.org/security.html#%E4%BC%9A%E8%AF%9D%E5%AD%98... 。
flash 是 rails 的特色,其他的语言或者 web 框架可能没有。flash 的生命周期介于 request 和 session 之间,可以在多次 request 传递知道被消费位置。