我正在使用Express框架。我想从socket.io联系会话数据。我尝试使用client.listener.server.dynamicviewhelpers数据Express Dynamichelpers数据,但我无法获取会话数据。有什么简单的方法吗?请查看代码

app.listen(3000);

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

io.on('connection', function(client){
    // I want to use session data here
    client.on('message', function(message){
        // or here
    });
    client.on('disconnect', function(){
        // or here
    }); 
});
有帮助吗?

解决方案

这对于通过FlashSocket传输的插座不起作用(它不会向服务器发送所需的cookie),但可靠地适用于其他所有内容。我只是禁用代码中的FlashSocket运输。

为了使其正常工作,在Express/Connect侧,我明确定义了会话存储,因此我可以在套接字内使用它:

MemoryStore = require('connect/middleware/session/memory'),
var session_store = new MemoryStore();
app.configure(function () {
  app.use(express.session({ store: session_store }));
});

然后在我的套接字代码中,包括连接框架,以便我可以使用其cookie解析来检索cookie的连接。然后,我在具有连接的会话商店中查找会话。SID像这样:

var connect = require('connect');
io.on('connection', function(socket_client) {
  var cookie_string = socket_client.request.headers.cookie;
  var parsed_cookies = connect.utils.parseCookie(cookie_string);
  var connect_sid = parsed_cookies['connect.sid'];
  if (connect_sid) {
    session_store.get(connect_sid, function (error, session) {
      //HOORAY NOW YOU'VE GOT THE SESSION OBJECT!!!!
    });
  }
});

然后,您可以根据需要使用会话。

其他提示

socket.io-sessions模块解决方案通过在客户端(脚本)级别公开会话ID,将应用程序曝光到XSS攻击。

检查一下 解决方案 而是(对于socket.io> = v0.7)。见文档 这里.

我建议不要完全重新发明轮子。您需要的工具已经是NPM软件包。我认为这是您需要的: session.socket.io这些天我正在使用它,我猜这将非常有帮助!将快递链接到socket.io层将具有很多优势!

编辑: 在尝试了一些不起作用的模块之后,我实际上走了并写了自己的图书馆来做到这一点。无耻的插头:请在 https://github.com/aviddiviner/socket.io-sessions. 。我将在下面留出我的旧帖子出于历史目的:


我非常整齐地得到这项工作,而不必绕过 flashsocket 按照运输 PR0ZAC上面的解决方案。我也在使用socket.io的express.io。就是这样。

首先,将会话ID传递给视图:

app.get('/', function(req,res){
  res.render('index.ejs', {
    locals: { 
      connect_sid: req.sessionID
      // ...
    }
  });
});

然后在您的视图中,将其链接到socket.io客户端:

<script>
  var sid = '<%= connect_sid %>';
  var socket = new io.Socket();
  socket.connect();
</script>
<input type="button" value="Ping" onclick="socket.send({sid:sid, msg:'ping'});"/>

然后在您的服务器端socket.io侦听器中,捡起并读取/编写会话数据:

var socket = io.listen(app);
socket.on('connection', function(client){
  client.on('message', function(message){
    session_store.get(message.sid, function(error, session){
      session.pings = session.pings + 1 || 1;
      client.send("You have made " + session.pings + " pings.");
      session_store.set(message.sid, session);  // Save the session
    });
  });
});

就我而言,我的 session_store 是redis,使用 redis-connect 图书馆。

var RedisStore = require('connect-redis');
var session_store = new RedisStore;
// ...
app.use(express.session({ store: session_store }));

希望这对在搜索Google时找到此帖子的人有帮助(就像我一样;)

看到这个: socket.io身份验证

我建议不要通过 client.request... 或者 client.listener... 因为那不是直接附着在 client 对象,始终指向最后登录的用户!

查看 socket.io-connect

连接websocket中间件包装器围绕socket.io节点https://github.com/bnoguchi/socket.io-connect

这将使您可以将socket.io请求推向Express/Connect中间件堆栈,然后再使用socket.io事件处理程序处理,使您可以访问会话,cookie等。虽然,我不确定它与所有socket.io的运输量一起使用。

您可以使用 Express-Socket.io-Session .

与socket.io共享基于Cookie的Express-Session中间件。使用Express> 4.0.0和socket.io> 1.0.0,并且不会向后兼容。

为我工作!

您可以看一下: https://github.com/bmeck/session-web-sockets

或者您可以使用:

io.on('connection', function(client) { 
  var session = client.listener.server.viewHelpers; 
  // use session here 
});

希望这可以帮助。

我不确定我做对了。https://github.com/learnboost/socket.io/wiki/authorizing

使用握手数据,您可以访问cookie。在cookie中,您可以获取连接。SID是每个客户端的会话ID。然后使用Connect.SID从数据库中获取会话数据(我假设您正在使用RedisStore)

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top