有没有一种简单的方法来共享在Rails和Node.js应用程序之间存储在Redis中的会话数据?

我有一个使用Redis作为会话存储的Rails 3.2应用程序。 现在我将在Node.js中编写一部分新function,并希望能够在两个应用程序之间共享会话信息。

我可以手动执行的操作是读取_session_id cookie,然后从名为rack:session:session_id的Redis密钥中读取,但这看起来有点像黑客解决scheme。

有没有更好的方式来共享Node.js和Rails之间的会话?

我已经这样做了,但它确实需要制造你自己的东西

首先,您需要使会话密钥具有相同的名称。 这是最简单的工作。

接下来,我创build了redis-store gem的叉子,并在编组的地方进行了修改。 我需要谈论双方的JSON,因为find一个JavaScript的ruby风格元帅模块是不容易的。 我改变编组的地方

我还需要更换连接的会话中间件部分。 创build的散列非常具体,并且与创build的一个轨道不匹配。 我将需要离开这个给你,因为可能有更好的方法。 我可以分叉连接,但我提取了连接>中间件>会话的副本,并需要我自己的。

你会注意到原来在rails版本中join了一个基本variables。 另外你需要处理的情况下,当轨道创build一个会议,而不是节点,这就是generateCookiefunction。

 /***** ORIGINAL *****/ // session hashing function store.hash = function(req, base) { return crypto .createHmac('sha256', secret) .update(base + fingerprint(req)) .digest('base64') .replace(/=*$/, ''); }; // generates the new session store.generate = function(req){ var base = utils.uid(24); var sessionID = base + '.' + store.hash(req, base); req.sessionID = sessionID; req.session = new Session(req); req.session.cookie = new Cookie(cookie); }; /***** MODIFIED *****/ // session hashing function store.hash = function(req, base) { return crypto .createHmac('sha1', secret) .update(base) .digest('base64') .replace(/=*$/, ''); }; // generates the new session store.generate = function(req){ var base = utils.uid(24); var sessionID = store.hash(req, base); req.sessionID = sessionID; req.session = new Session(req); req.session.cookie = new Cookie(cookie); }; // generate a new cookie for a pre-existing session from rails without session.cookie // it must not be a Cookie object (it breaks the merging of cookies) store.generateCookie = function(sess){ newBlankCookie = new Cookie(cookie); sess.cookie = newBlankCookie.toJSON(); }; //... at the end of the session.js file // populate req.session } else { if ('undefined' == typeof sess.cookie) store.generateCookie(sess); store.createSession(req, sess); next(); } 

我希望这对你有用。 我花了相当多的时间来挖掘他们的话题。

我发现一个问题以及存储在json中的flash消息。 希望你没有find那个。 Flash消息有一个特殊的对象结构,当序列化时,json会吹走它。 从会话中恢复Flash消息时,可能没有正确的Flash对象。 我也需要补丁。

如果你不打算使用这个,这可能是完全没有帮助的,但是我所有的会话都是通过使用Connect来实现的。 您可以使用connect session middlewhere并更改密钥ID:

http://www.senchalabs.org/connect/session.html#session

并使用此模块将redis用作会话存储:

https://github.com/visionmedia/connect-redis

我从来没有设置类似于你描述的东西,但可能有一些必要的黑客攻击。