【问题标题】:Adding a cookie value on Socket.IO在 Socket.IO 上添加 cookie 值
【发布时间】:2012-06-02 00:50:27
【问题描述】:

如何在 Socket.IO 上添加 cookie 值?

io.sockets.on('connection', function (client)
{ 
    console.log(client.id); 
    client.handshake.headers.cookie.socketID = client.id;   // not work
 // client.handshake.headers.cookie("socketID",client.id);  //crash

    console.log(client.handshake.headers.cookie);
// The current output is:
//connect.sid=tI21xumy3u2n4QXO1GljmPAf.pzFQ1Xu%2B6bz36secu4VSCdSNU8PT1L44gQZ4kFUFQqQ
//this is express session id, and I also want to add client.id of Socket.IO. 

//...........
}

我读过 http://www.danielbaulig.de/socket-ioexpress/ ,但我不需要node.js上的会话管理,只需要像connect.sid一样在cookie中添加一个socket.io客户端ID值。

【问题讨论】:

标签: node.js cookies express socket.io


【解决方案1】:

看看Authorization 与 Socket.io。这是它处理初始连接请求的地方,您可以在其中设置响应标头。

我不确定cookie(name,value) 速记是否有效,但您可以尝试手动设置:

    var date = new Date();
    date.setTime(date.getTime()+(days*24*60*60*1000)); // set day value to expiry
    var expires = "; expires="+date.toGMTString();

    handshake.headers.cookie = name+"="+value+expires+"; path=/";

【讨论】:

  • 谢谢你,韦斯。我更了解 Socket.io 的授权。但是,我担心的是,由于该块位于“io.sockets.on('connection', function (client){......})”之外,它看起来无法处理 client.id我想包含在 cookie 中。对此有何建议??
  • 我会用客户端代码来处理事情。即:使用套接字 ID 作为数据向客户端发出事件,并让客户端代码保存一个 cookie。然后,您可以通过handshake.headers.cookie 在服务器端的授权块中读取请求cookie。不过,我不确定您为什么要这样做,因为 socket.id 不应该在会话之间保留。在断开连接时它是无关紧要的。
  • 我建议使用授权来保存特定于客户端的数据,因为您在授权时对handshake.headers 所做的任何更改都可以在您的主应用程序中的client.handshake 中访问,正如您上面建议的那样。如果没有关于您的用例的更多信息,很难获得更具体的信息。
  • 正如你所建议的,我发现这种cookie需要从客户端添加,它现在可以工作了。谢谢。在上面的问题页面上也添加这个。再次感谢!
  • @C4u 这个答案是 5 年前的,我相信 Socket.io 更改了授权回调以删除 handshake 属性。见the docs。无论哪种方式,您都应该使用浏览器网络开发工具来检查初始套接字请求/响应标头,以查看您的 cookie 发生了什么。
【解决方案2】:

可能看起来很老套,我尝试了各种方法来设置 cookie 以响应握手获取请求,但均未成功。但是,我设法通过自行调整 socket.io 原型代码使其工作。

在 socket.io 版本 1.3.4 中,

在 \node_modules\socket.io\node_modules\engine.io\lib\server.js 中

将第 249 行从 :

headers['Set-Cookie'] = self.cookie + '=' + id;

headers['Set-Cookie'] = req.headers.cookie;

请求中的所有cookie都会在响应中返回

【讨论】:

  • 更改源代码不是一个好主意,因为当您更新版本或在另一台服务器上安装应用程序时,您的更改将会丢失。
  • 这是一个糟糕的建议。这只会在下一个 npm install 之前有效。
  • 在撰写此评论时没有其他解决方案
  • 唯一安全的方法是 fork socket.io,并定期从活动项目中修补您的版本。虽然我不推荐它,但你不应该因为建议一个有效的 hack 而投反对票。
  • 只是为了争论。他可以在运行时更改原型。所以它会优先于 npm install
猜你喜欢
  • 2016-01-23
  • 2010-09-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多