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

傲骄不是病 9 years, 11 months ago

相对于current_user,cookies和session是什么呢?

第一:session和cookie是两种会话机制:session存储在服务器里,cookie存储在本地电脑里!他们的作用都是让本地PC的浏览器与远程服务器半永久性链接;
第二:关于current_user(当前用户)是一个方法,这个current_user方法可以用session或cookie或者两者一起用,作用就是让本地PC的浏览器与远程服务器半永久性链接;

能美·库特 answered 9 years, 11 months ago

对于 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 传递知道被消费位置。

战場原黑儀 answered 9 years, 11 months ago

Your Answer