没有express.js的Socket.io会话?

时间:2012-08-25 14:22:40

标签: node.js session express websocket socket.io

我想通过node.js和socket.io对websockets进行会话处理,而不必使用cookie并避免使用express.js,因为还应该有客户端不在浏览器环境中运行。有人已经做过这个或者有过概念证明的经验吗?

2 个答案:

答案 0 :(得分:3)

在建立socket.io连接之前,有一个握手机制,默认情况下,所有正确传入的请求都成功握手。但是,有一种方法可以在握手期间获取套接字数据,并根据您选择接受或拒绝传入连接请求的方式返回true或false。以下是来自socket.io docs的示例:

  

因为在授权之后存储了handshakeData,所以您可以实际添加或删除此对象中的数据。

var io = require('socket.io').listen(80);

io.configure(function (){
  io.set('authorization', function (handshakeData, callback) {
    // findDatabyip is an async example function
    findDatabyIP(handshakeData.address.address, function (err, data) {
      if (err) return callback(err);

      if (data.authorized) {
        handshakeData.foo = 'bar';
        for(var prop in data) handshakeData[prop] = data[prop];
        callback(null, true);
      } else {
        callback(null, false);
      }
    }) 
  });
});

回调函数的第一个参数是错误,你可以在这里提供一个字符串,如果没有设置为null,它将自动拒绝客户端。第二个参数是布尔值,无论你是否想接受传入的请求。

答案 1 :(得分:1)

这应该有用,https://github.com/LearnBoost/socket.io/wiki/Authorizing

您可以使用 handshakeData

中提供的以下内容的组合来跟踪所有会话变量并唯一标识用户
{
   headers: req.headers       // <Object> the headers of the request
 , time: (new Date) +''       // <String> date time of the connection
 , address: socket.address()  // <Object> remoteAddress and remotePort object
 , xdomain: !!headers.origin  // <Boolean> was it a cross domain request?
 , secure: socket.secure      // <Boolean> https connection
 , issued: +date              // <Number> EPOCH of when the handshake was created
 , url: request.url          // <String> the entrance path of the request
 , query: data.query          // <Object> the result of url.parse().query or a empty object
}

此示例也可能有所帮助,只需让您的非浏览器客户端以不同的方式提供信息:

SocketIO + MySQL Authentication