我正在尝试基于sails.js构建聊天应用程序。来自特定聊天的消息的URL如下所示:
/api/chat/:id/messages
当我使用XHR请求此URL时,它提供会话cookie并且sails.js构建会话对象。我可以轻松检查用户权限,以便从特定聊天中读取消息。
但是,我需要使用socket.io请求此URL,以便客户端可以订阅messages
集合的所有未来更改。
当我使用socket.io请求此URL时,没有设置会话cookie并且sails.js会话为空。所以,我无法检查服务器端的用户权限。
我知道套接字请求不是HTTP请求。他们不会自己提供任何cookie。
有没有简单的解决方法?
答案 0 :(得分: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
或类似内容。
答案 1 :(得分:3)
请在发送套接字请求之前从您的应用程序发送JSONP请求,这将创建一个cookie并接受套接字请求。
答案 2 :(得分:1)
您可以通过socket.post()而不是XHR进行初始登录,后续套接字请求将被授权。
答案 3 :(得分:0)
alevkon,在上面提到的方法中你必须在所有控制器中实现相同的功能,因为你不知道第一次访问哪个控制器......但是只发送一个jsonp请求就可以创建一个cookie在客户端和服务器之间,使用相同的cookie直到下一个会话。