最近、RailsとErlangアプリの間でセッションデータを共有したいという同様の問題が発生しました。私の解決策は、Rack::Session::Abstract::ID
セッションをハッシュ値としてRedisに保存するクラスを作成することでした。タイプMarshal.dump
は必要ありません。String
これにより、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|
# keep string values bare so other languages can read them
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
これは、次のレールから使用できます。
MyApp::Application.config.session_store MaybeMarshalRedisSession
ラックから:
use MaybeMarshalRedisSession
そして他の場所から:
redis.hgetall("rack.session:#{session_id}")
MainAppまたはNode.jsからPhotoAppを呼び出す場合は、ユーザーのセッションCookieを含むHTTPリクエストを作成できます。