我最近遇到了一个类似的问题,想要在Rails和Erlang应用程序之间共享会话数据。我的解决方案是编写一个Rack::Session::Abstract::ID
类,将会话存储在Redis中作为哈希值。它不会对String
类型调用Marshal.dump
。这允许非Ruby应用程序在具备session_id
的情况下使用一些会话值。
require 'rack/session/abstract/id'
class MaybeMarshalRedisSession < Rack::Session::Abstract::ID
def initialize(app, options = {})
@redis = options.delete(:redis) || Redis.current
@expiry = options[:expire_after] ||= (60 * 60 * 24)
@prefix = options[:key] || 'rack.session'
@session_key = "#{@prefix}:%s"
super
end
def get_session(env, sid)
sid ||= generate_sid
session = @redis.hgetall(@session_key % sid)
session.each_pair do |key, value|
session[key] = begin
Marshal.load(value)
rescue TypeError
value
end
end
[sid, session]
end
def set_session(env, sid, session, options={})
@redis.multi do
session.each_pair do |key, value|
value = value.is_a?(String) ? value : Marshal.dump(value)
@redis.hset(@session_key % sid, key, value)
end
@redis.expire(@session_key % sid, @expiry)
end
sid
end
def destroy_session(env, sid, option={})
@redis.del(@session_key % sid)
generate_sid unless options[:drop]
end
end
你可以在 Rails 中使用以下代码:
MyApp::Application.config.session_store MaybeMarshalRedisSession
从机架中获取:
use MaybeMarshalRedisSession
而来自其他地方的是:
redis.hgetall("rack.session:#{session_id}")
如果您想从您的MainApp或Node.js中调用PhotoApp,您可以发起一个HTTP请求,并包含用户会话cookie。