从iframe连接时出现socket.io错误

时间:2013-07-05 23:55:49

标签: javascript node.js socket.io

所以我在网络内部的不同服务器上有几个应用程序,我使用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();
});

对于大量代码感到抱歉,但试图提供所有必需的conte4xt。本质上服务器已启动并运行,应用程序1连接并获取唯一的会话ID,然后当应用程序2尝试从iframe连接时,我得到上述错误,当应用程序2不在iframe中时,它连接正常并获得会话ID。请尽可能帮助,我无法弄清楚为什么它会被阻止,我真的需要这个并且正常运行。提前感谢您的任何帮助

1 个答案:

答案 0 :(得分:0)

您遇到了同源政策。

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

由于您可以通过CORS访问I.T时间 您基本上必须将服务器配置为允许来自您的域的 XSS

您还可以尝试以下方式:

document.domain = "intranet"

阅读here