我想通过node.js和socket.io对websockets进行会话处理,而不必使用cookie并避免使用express.js,因为还应该有客户端不在浏览器环境中运行。有人已经做过这个或者有过概念证明的经验吗?
答案 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
}
此示例也可能有所帮助,只需让您的非浏览器客户端以不同的方式提供信息: