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

posted on 2014-06-12 12:20  许利强  阅读(...)  评论(...编辑  收藏

导航