如何解决Socket.io 在本地主机断开连接时接收 Cookie,而不是其他域
当用户通过关闭浏览器或正确注销而断开连接时,我的服务器会收到 cookie,即“socket.handshake.headers.cookie”:
socket.on('disconnect',async () => {
if (socket.handshake.headers && socket.handshake.headers.cookie) {
var cookies = cookie.parse(socket.handshake.headers.cookie);
if (cookies && cookies.Token) {
const secret = process.env.JWT_SECRET;
const verificationResponse: any = jwt.verify(cookies.Token,secret) as DataStoredInToken;
const uid = verificationResponse.uid;
await Presence.deleteMany({
uid: uid
}).exec(async (err,data) => {
});
console.log("uid : ",uid)
io.emit("syncOfflineUsers",uid);
...
基本上,如果服务器发现有人断开连接,它会使用 cookie 找出谁断开连接并从数据库中删除。
这在本地主机上测试时效果很好。但它在我的实际服务器上不起作用,域名不同。
不知道是nginx问题还是socket.io问题。
这里是nginx的服务器域设置:
server {
listen 80;
server_name app5.myserv.com;
location / {
proxy_pass http://localhost:4002/;
}
}
这是我的客户端(react)的 nginx 域设置:
server {
listen 80;
server_name app1.myserv.com;
location / {
proxy_pass http://localhost:4001/;
}
}
在 React 客户端上,我连接到 socket.io 后端,如:
import io from "socket.io-client";
const socket = io.connect("http://app5.myserv.com",{ forceNew: true });
我如何解决这个问题,让它不仅在本地主机上而且在不同的域上接收 cookie?
除了这个问题,Socket.io 一切正常。
非常感谢。
我认为这是起源问题。 如果我将服务器地址设置为“app1.localhost:4002”,客户端地址设置为“app1.localhost:4001”,那么它会发送 cookie 并且运行良好。
看起来 Socket.io 客户端不会将 cookie 发送到不同的域。 如果 socket.handshake.headers.origin 有 'sec-fetch-site': 'same-site',它就可以工作。但如果是“跨站点”,则不起作用。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。