Rails session

什么是session

session可以存储多个请求需要共享的数据。
当你对一个页面发送请求的时候,rails服务器的response将会返回一个cookie。

Set-Cookie: ...

浏览器会保存这些cookie,直到cookie过期,当你每次发送一个请求。浏览器会把这个cookie发送到服务器。

Rails中session使用过程

服务器端

  1. 当使用session[:current_user_id] = 1赋值
  2. Rails将会创建一个session表,产生一个随机的session id。(09497d46978bf6f32265fefb5cc52264)
  3. Rails将会存储{current_user_id: 1}(Base64编码)到session的data属性中。
  4. 返回session id,然后将session id存到cookie里发送到浏览器(如果要将session存储到cookie中,rails会将data一并存储到cookie中去)

浏览器

  1. 当浏览器下次发送请求到服务器的时候会带上这个cookie,也就是session id
  2. Rails会根据session id去session表中查询出对应的session值
  3. 从记录的data属性中返回current_user_id

在Rails中默认使用Cookie保存Session信息。配置文件在config/initializers/session_store.rb中。在文件config/secrets.yml中设置了一组secret_key_base用来加密需要保护的Cookie信息,修改这个数会让存在用户浏览器的Cookie Session失效。可以用这个来强制重新登录。
也可以在这个文件中添加第三方的key或者token。可以通过Rails.application.secrets.some_api_key访问到设置的数据。


使用memcached

可以在config/environments/production中设置
config.cache_store = :mem_cache_store


使用数据库


Rails session解密


  1. 在rails中设置session
session[:current_user_id] = 12
session[:user] = "2b"
  1. 在浏览器查看
Paste_Image.png
  1. 解密cookie
require 'rubygems'
require 'cgi'
require 'active_support'
require 'action_controller'

def decrypt_session_cookie(cookie, key)
  cookie = CGI::unescape(cookie)

  # Default values for Rails 4 apps
  key_iter_num = 1000
  key_size     = 64
  salt         = "encrypted cookie"
  signed_salt  = "signed encrypted cookie"

  key_generator = ActiveSupport::KeyGenerator.new(key, iterations: key_iter_num)
  secret = key_generator.generate_key(salt)
  sign_secret = key_generator.generate_key(signed_salt)

  encryptor = ActiveSupport::MessageEncryptor.new(secret, sign_secret, serializer: ActiveSupport::MessageEncryptor::NullSerializer)
  # puts MarShal.load(encryptor.decrypt_and_verify(cookie))

  puts encryptor.decrypt_and_verify(cookie)
end


# 
cookie = 'cTI0N2R6SVc5VlFqRGtjalZobXdsWmdDeVVaajlIU3JpU052T3ZVVkp1ZEdXQ29YSGRNcGxuYmJmd2IzQUNFL0hRNGgzY0ZWOUtxR2FJU2NWc3FSZTdoU0hWQlZ6TmRjazNHN0RXV2d3N1VyeTZkSXFzaTZ0K0g1a1JpaENwTGMtLTdTUUlpeFd2ZTNvWWVYRHVvNFdPUEE9PQ%3D%3D--98bbeff308c62d37472caa84ea47af49a67b50dd'
# key是rails中secrets.yml中设置的secret_key_base
key = '9ef39555bee9dc9d2a8aa1b519ba4221ef722ed9bf248e789946cf317f5ff087d3fde1eb8c60eca6fe8b3b851c9cde2f7c318506e6b416f6938aa8203d4625e5'

decrypt_session_cookie(cookie, key)
  1. 解密后的数据
Paste_Image.png

通过解密完全得到原始数据,所以在session中千万不要存储重要的数据。也千万不要将key泄漏出去。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,590评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 86,808评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,151评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,779评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,773评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,656评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,022评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,678评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,038评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,659评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,756评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,411评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,005评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,973评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,053评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,495评论 2 343

推荐阅读更多精彩内容

  • How Rails Sessions Work如果你的Rails应用不知道谁在访问它?如果同一个人请求两个不同的页...
    李小西033阅读 1,990评论 1 4
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,596评论 18 139
  • 22年12月更新:个人网站关停,如果仍旧对旧教程有兴趣参考 Github 的markdown内容[https://...
    tangyefei阅读 35,159评论 22 257
  • http协议有http0.9,http1.0,http1.1和http2三个版本,但是现在浏览器使用的是htt...
    一现_阅读 1,855评论 0 3
  • Python列表 1.list:list是一种有序的集合,可以随时添加和删除其中的 元素。(从0开始) []...
    illaclv阅读 1,138评论 0 0