Rails4.1多工程共享Session
第一步:cookies的设置
打开config/initializers/session_store.rb文件 ,其代码如下
Demo::Application.config.session_store :cookie_store, key: '_demo_session'
这个文件的做用就是,生产 以'_demo_session'为key生成一个cookies,并把session_id记录在cookies中(cookies里还包括Domain,Expires等等信息,这里不考虑)。我们要做的就是 把我们要共享session的几个项目 的 key 改成一样的。
第二步:修改secret_key_base
打开 config/secrets.yml 文件 ,修改对应模式下的secret_key_base,使得需要共享session的各项目,secret_key_base相同。
development: secret_key_base: 43aa140abe78fd65f85729e8d9d9e3e29eff4e5d8ea2a8fcb4fffc49d25c3cfaf3a7030c93cd4aafe7ee99b940078962b0168207784a03b2604fc9c323371127 test: secret_key_base: 32999d37418ebafba8b6b81e7bac28d8b462a9925221f92b06573c3bcccc0e5b4221dd8924c2e9009b58236e2f060cfe1db445db37c0ebbc4cfd54ad1ea4f393 # Do not keep production secrets in the repository, # instead read values from the environment. production: secret_key_base: <%= ENV["SECRET_KEY_BASE"] %>
secret_key_base的作用是对cookies进行加密用的密钥
注:在Rails4.0之前使用的是config/initializer/secret_token.rb文件夹的Demo::Application.config.secret_token 配置。
至此,需要共享session的工程在同一个客户端会使用一个Cookies。
第三步 取得session_id
因为各项目共用一个客户端Cookies,他们的Session_id也是相同的,可以直接取到Session_id
@session_id = session.id
第四不 将登录信息放到Redis上共享
Gemfile文件添加
gem "redis", "~> 3.0.7"
在用户登录后,以session_id为可以,用户信息的hash队列为value保存到Redis上
redis = Redis.new(:host=>'172.30.1.100', :port => 6380, :db => 2) #因为是登录用的是devise做权限验证,所以用户信息保存在current_user #注意方法的第二个参数必须是个hash队列,所以用current_user.attributes redis.mapped_hmset(session.id,current_user.attributes)
取得Redis保存的用户信息
#创建的redis实例必须参数相同 ,不同的db数据不能互通 r = Redis.new(:host=>'172.30.1.100', :port => 6380, :db => 2) # 按 (key,fieldname) 方式获取,username的value r.hmget('f7e046e16349c98f29b9d102c309219c','username') >> ["xulq"] #我们返回的是Array类型,所以我们取里面的.first,得到我们要的值 r.hmget('f7e046e16349c98f29b9d102c309219c','username').first >> "xulq" # 获取,key对应的hash队列所有的filedname,只是filedname,没有value r.hkeys('f7e046e16349c98f29b9d102c309219c') >>["id", "email", "encrypted_password", "reset_password_token", "reset_password_sent_at", "remember_created_at", "sign_in_count", "current_sign_in_at", "last_sign_in_at", "current_sign_in_ip", "last_sign_in_ip", "created_at", "updated_at", "username"] # 获取,key对应 hash队列的长度 r.hlen('f7e046e16349c98f29b9d102c309219c') >>14
其他一些关于Redis的命令请参考 http://redis.io/commands