Nodejs求教!我这个socket.io怎么获取不到cookie呢
Nodejs求教!我这个socket.io怎么获取不到cookie呢
var io = socketio.listen(server);
/…/
/set io/
io.set(‘log level’, 1);
io.set(‘authorization’, function(handshakeData, callback) {
console.log(“handshakeData是:”);
console.log(handshakeData);
if (!handshakeData.headers.cookie) {
console.log(“socket.io没有发现cookie”);//here,会提示没有发现cookie。。。
//return callback(‘socket.io: no found cookie.’, false);
}else{
var signedCookies = require(‘express/node_modules/cookie’).parse(handshakeData.headers.cookie);
handshakeData.cookies = require(‘express/node_modules/connect/lib/utils’).parseSignedCookies(signedCookies,“ICU”);
console.log(“获取到的用户cookie是:”);
console.log(handshakeData.cookies);
/…/
}
});
3 回复
提供你的socket.io版本的话别人也会更有针对性的回答你的问题的啊~ pre2 版本里, 可以这样获取
var io = require('socket.io')();
io.use(function(socket, next){
if (socket.request.headers.cookie) return next();
next(new Error('Authentication error'));
});
也就是说0.9.* 版本里的 socket.handshake
现在已经废弃掉, 换成了 socket.request
来做握手data的引用~
参考:https://github.com/LearnBoost/socket.io/issues/1510
从你提供的代码来看,问题可能出在 handshakeData.headers.cookie
没有正确传递。通常情况下,客户端发起的 WebSocket 连接不会自动带上 HTTP Cookie。你需要在客户端显式地将 Cookie 附加到 WebSocket 连接中。
以下是一个示例代码,展示如何在客户端发送 WebSocket 连接时带上 Cookie:
客户端代码
const socket = new WebSocket('ws://yourserver.com/socket.io/?EIO=3&transport=websocket');
socket.onopen = () => {
const cookies = document.cookie;
socket.send(JSON.stringify({type: 'cookie', data: cookies}));
};
socket.onmessage = (event) => {
console.log('Server:', event.data);
};
服务器端代码
var io = require('socket.io')(server);
var cookie = require('cookie');
io.use(function(socket, next) {
const handshakeData = socket.request;
// 从自定义消息中提取 Cookie
handshakeData.on('message', function(message) {
const data = JSON.parse(message.data);
if (data.type === 'cookie') {
handshakeData.headers.cookie = data.data;
next();
}
});
});
io.on('connection', function(socket) {
console.log('Client connected');
socket.on('disconnect', function() {
console.log('Client disconnected');
});
});
解释
- 客户端:在 WebSocket 连接打开后,将当前页面的 Cookie 发送到服务器。
- 服务器:监听来自客户端的消息,并从中提取 Cookie。然后将其添加到
handshakeData.headers.cookie
中,以便后续处理。
这样可以确保在 WebSocket 连接时能够获取到 Cookie。