【问题标题】:socket.io error when connecting from iframe从 iframe 连接时出现 socket.io 错误
【发布时间】:2013-07-05 23:55:49
【问题描述】:

所以我在我们网络内部的不同服务器上有几个应用程序,我使用 node.js 和 socket.io js 来处理它们之间的实时通信,当每个单独运行时都可以正常工作,但是当我把应用程序 1 上的 iframe 中的应用程序 2 我收到以下错误 “阻止了来源为“http://192.128.1.97”的帧访问来源为“http://Intranet”的帧。协议、域和端口必须匹配。“ *注意我在上面的网址中添加了空格,因为页面告诉我链接是不允许的。

有没有办法让 iframe 连接到 socket.io?代码很简单,但是这里是服务器代码...

/**
 * Server js file for node
 * this will handle all of the incoming requests from all the apps
 * and push them to the clients
 */

var express = require("express"),
    app = express(),
    http = require("http").createServer(app),
    io = require("socket.io").listen(http);
    _ = require("underscore");

var participants = [];

// setup the environment and tell node and express what it needs
app.set("ipaddr", "192.168.1.76");
app.set("port", 8080);
app.set("views", __dirname + "/views");
app.set("view engine", "jade");

//further environment setup telling node and express what to use to handle requests
app.use(express.static("public", __dirname));
app.use(express.bodyParser());

//setup the default page
app.get("/", function(request, response) {
    //render the view page
    //response.render("node_home");
    //just post a message to the screen
    response.send("Server is up and running");
    //respond with a json object
//    reponse.json(200, {message: "Server is up and running"});
});

//setup a handler for requests to /message
app.post("/message", function(request, response) {
    var message = request.body.message;
    if(_.isUndefined(message) || _.isEmpty(message.trin())) {
        return response.json(400, {error: "Message is invalid"});
    }

    var name = request.body.name;
    io.sockets.emit("incomingMessage", {message: message, name: name});
    response.json(200, {message: "Message received"});
})

io.on("connection", function(socket) {
    socket.on("newUser", function(data) {
        participants.push({id: data.id, name: data.name});
        io.sockets.emit("newConnection", {participants: participants, badgeNumber: data.badgeNumber, id: data.id})
    });
    socket.on("nameChange", function(data) {
        _findWhere(paticipants, {id: socket.id}).name = data.name;
        io.sockets.emit("nameChanged", {id: data.id, name: data.name})
    });
    socket.on("disconnect", function() {
        participants = _.without(participants, _.findWhere(participants, {id: socket.id}));
        io.sockets.emit("userDisconnected", {id: socket.id, sender: "system"})
    });
    socket.on("phraseCheck", function(data) {
        io.sockets.emit("checkPhrase", {id: data.id, phrase: data.phrase});
    });
    socket.on('newFluxClient', function(data) {
    console.log(data);
        io.sockets.emit('fluxConnection', {badgeNumber: data.badgeNumber, id: data.id});
    });
    socket.on('phraseAllowed', function(data) {
        io.sockets.emit('allowedPhrase', {id: data.id, allowed: data.allowed});
    });
    socket.on('customFunction', function(data) {
        console.log(data);
    io.sockets.emit('customFunction', data);
    });
});


//start the app and have it listen for incoming requests
http.listen(app.get("port"), app.get("ipaddr"), function() {
    console.log("Server up and running. Go to http://" + app.get("ipaddr") + ":" + app.get("port"))
});

应用程序 1 代码....

/**
 * client js file
 * this will handle connecting to node and handle the incoming messages
 * as well as sending responses and messages to the server
 */
var childSessionId = '',
sessionId = '',
socket = '',
serverBaseUrl = '',
participants = [];

function init() {
serverBaseUrl = 'http://192.168.1.76:8080';

socket = io.connect(serverBaseUrl);

sessionId = '';
function updateParticipants(part) {
    participants = part;
    $("#participants").html('');
    for(var i=0; i<participants.length;i++) {
        $("#participants").append('<span id="' + participants[i].id + '">' + participants[i].name + ' ' + (participants[i].id === sessionId ? '(You)' : '') + '<br /></span>');
    }
}
socket.on('connect', function() {
   sessionId = socket.socket.sessionid;
    console.log('Connected ' + sessionId);
    socket.emit("newUser", {id: sessionId, name: page.user});
});
socket.on('userDisconnect', function(data) {
    $('#' + data.id).remove();
});
socket.on('nameChanged', function(data) {
    $('#' + data.id).html(data.name + ' ' + (data.id === sessionId ? '(You)' : '') + '<br />');
});
socket.on('newConnection', function(data) {
    if(data.badgeNumber === page.userBadgeNumber) {
        childSessionId = data.id;
    }
    updateParticipants(data.participants);
});
socket.on('fluxConnection', function(data) {
    console.log('flux connection data:');
    console.log(data);
    if(data.badgeNumber === "**********") {
        childSessionId = data.id;
    }
});
socket.on('incomingMessage', function(data) {
    $("#messages").prepend('<b>' + data.name + '</b><br />' + data.message + '<hr />');
});
socket.on('error', function(reason) {
    console.log('Unable to connect to server', reason);
});
socket.on('customFunction', function(data) {
    console.log(data);

        data.data();

});
socket.on('checkPhrase', function(data) {
    if(data.id === childSessionId) {
        var phrases = shoppingcart.getPhrasesInCart();
        var allowed = ($.inArray(data.phrase, phrases) >= 0);
        socket.emit('phraseAllowed', {id: data.id, allowed: allowed});
    }
});

}
$(document).ready(function() {
    init();
})

和应用程序 2 代码....

// NODE JS INITIALIZATION
var socket = null;
var sessionId = '';
function initialize_node(){

var serverBaseUrl = 'http://192.168.1.76:8080';

socket = io.connect(serverBaseUrl);
sessionId = '';

socket.on('connect', function() {
    sessionId = socket.socket.sessionId;
    socket.emit('newFluxClient', {id: sessionId, badgeNumber: "PDX000022", name: "matthew.hicks"});
//        socket.emit('newUser', {id: sessionId, badgeNumber: user.badge, name: user.name});
})

socket.on('allowedPhrase', function(data) {
    if(sessionId === data.id) {
        alert("I'm a preddy little princess. Console logging data returned");
        console.log(data);
        /*
         functions to allow or disallow the phrase
         based on data.allowed
         it will be true if the phrase is in the shopping cart
         and false if it is not
         */
    }
});

//  $('#phrase').blur(function() {
//      checkPhrase();
//  })
};

function checkPhrase() {
//var phrase = $('#phrase').val();
var phrase = "Shindigs in Ptown";
socket.emit('phraseCheck', {id: sessionId, phrase: phrase});
}


$(document).ready(function () {
initialize_node();
});

抱歉,代码量很大,但试图提供所有必要的内容。基本上服务器已启动并正在运行,应用程序 1 连接并获取唯一的会话 ID,然后当应用程序 2 尝试从 iframe 连接时,我收到上述错误,当应用程序 2 不在 iframe 中时,它连接得很好并获得会话ID。如果可以,请提供帮助,我不知道为什么它会被阻止,我真的需要它启动并运行。提前感谢您的任何帮助

【问题讨论】:

    标签: javascript node.js socket.io


    【解决方案1】:

    您遇到了同源策略。

    最简单的解决方案是从同一台服务器运行 iframe。

    既然您可以访问 I.T 时间,请阅读 CORS 您基本上必须将服务器配置为允许来自您的域的 XSS

    你也可以试试:

    document.domain = "intranet"
    

    阅读它here

    【讨论】:

    • 不行,应用程序 2 必须在特定服务器上,并且 I.T.部门不想从该服务器运行节点,他们希望它在单独的服务器上以防万一。所以基本上所有 3 个应用程序都必须在不同的服务器上。我假设使用 node 和 socket.io,您不会遇到相同策略来源的问题,因为它们旨在允许在所有应用程序上进行基于推送的通知,而不管服务器如何
    • 我编辑了我的答案。您可能会遇到这种情况,因为您将 socket.io 包装在 iframe 中
    猜你喜欢
    • 2020-02-05
    • 2021-10-07
    • 2019-10-06
    • 2021-10-07
    • 2015-01-02
    • 1970-01-01
    • 1970-01-01
    • 2020-04-04
    • 2014-06-10
    相关资源
    最近更新 更多