Rails中的Sessions和Cookies

Posted by baicai on July 1, 2016

Sessions


HTTP是一种无状态的通讯协议,为了能够让浏览器能够在跨</span>request 之间记住信息,</span> Rails 提供了</span> Session 功能,像是记住登入的状态、记住用户购物车的内容等等,都是用</span> Session 实作出来的。 </p>

要操作</span>Session,直接操作</span>session这个 Hash变量即可。 例如:</span></p>

session[:cart_id] = @cart.id

Session 原理可以参考 Session_ID,基本上也是利用浏览器的cookie来追踪</span> requests 请求。 </p>

Session storage


Rails默认采用 Cookies session storage 来储存</span> Session 数据,它是将 Session 数据透过 config/secrets.yml 的</span> secret_key_base 编码后放到浏览器的</span> Cookie 之中,最大的好处是对服务器的效能负担很低,缺点是大小最多</span> 4Kb ,以及数据还是可以透过反编码后看出来,只是无法进行修改。 因此安全性较低,不适合存放机密数据。 </p>

除了Cookies session storage,</span>Rails 也支持其他方式,你可以修改</span> config/initializers/session_store.rb :</span></p>

  • :active_record_store 使用数据库来储存
  • :mem_cache_store 使用Memcached快取系统来储存,适合高流量的网站

一般来说使用默认的Cookies session storage即可,如果对安全性较高要求,可以使用数据库。 如果希望兼顾效能,可以考虑使用Memcached

采用:active_record_store的话,必须安装</span>activerecord-session_ store gem,然后产生</span>sessions数据表:</p>

$ rails g active_record:session_ migration
$ rake db:migrate

Cookies


除了 Session ,我们也可以直接操作底层的</span> Cookie ,以下是一些使用范例:</p>

# Sets a simple session cookie.
cookies[:user_name] = "david"


# Sets a cookie that expires in 1 hour.
cookies[:login] = { :value => "XJ-122", :expires => 1.hour.from_now }


# Example for deleting:
cookies.delete :user_name


cookies[:key] = {
   :value => 'a yummy cookie',
   :expires => 1.year.from_now,
   :domain => 'domain.com'
}


cookies.delete(:key, :domain => 'domain.com')

因为数据是存放在用户浏览器, 所以如果需要保护不能让用户乱改,</span>Rails也提供了Signed方法:</span></p>

 cookies.signed[:user_preference] = @current_user.preferences

另外,如果是尽可能永远留在用户浏览器的数据,可以使用Permanent 方法:</span></p>

cookies.permanent[:remember_me] = [current_user.id, current_user.salt]

两者也可以加在一起用:</span></p>

cookies.permanent.signed[:remember_me] = [current_user.id, current_user.salt]