8

我正在尝试构建一个基于sails.js 的聊天应用程序。来自特定聊天的消息的 url 如下所示:

/api/chat/:id/messages

当我用 XHR 请求这个 url 时,它提供了一个会话 cookie,并且sails.js 构建了一个会话对象。我可以轻松检查用户权限以阅读特定聊天中的消息。

但是,我需要使用 socket.io 请求此 url,以便客户端可以订阅该messages集合的所有未来更改。

当我使用 socket.io 请求此 url 时,没有设置会话 cookie,并且sails.js 会话为空。因此,我无法检查服务器端的用户权限。

我明白套接字请求不是 HTTP 请求。他们自己不提供任何cookies。

有没有简单的解决方法?

4

4 回答 4

5

我找到了一种方法来获取在 socket.io 握手时设置的会话对象。在您的控制器中,您应该执行以下操作:

myControllerAction: function(req, res) {
    var session = req.session;
    if (req.isSocket) {
        var handshake = req.socket.manager.handshaken[req.socket.id];
        if (handshake) {
            session = handshake.session;
        }
    }
    //session now contains proper session object
}

您可以在sails.js 策略中实现这一点,并将此策略附加到某些控制器。但是不要将您的套接字会话写入req.session!否则,您将在尝试响应客户端时遇到错误(原件req.session仍以某种方式使用)。相反,将其另存为req.socketSession或类似的东西。

于 2013-08-17T18:30:41.603 回答
3

请在发送套接字请求之前从您的应用程序发送 JSONP 请求,这将创建一个 cookie 并接受套接字请求。

于 2013-08-15T11:57:43.030 回答
1

您可以通过 socket.post() 而不是 XHR 进行初始登录,随后的套接字请求将被授权。

于 2014-05-29T21:41:04.950 回答
0

alevkon,在上述方法中,您必须在所有控制器中实现相同的,因为您不知道第一次访问哪个控制器...但是只需发送一个 jsonp 请求,您就可以在客户端和服务器,在下一个会话之前使用相同的 cookie。

于 2013-08-18T08:13:35.750 回答