如果JS代码未托管在服务器上(CORS?),则Strophejs XMPP Hello World无法连接到服务器

如果JS代码未托管在服务器上(CORS?),则Strophejs XMPP Hello World无法连接到服务器,xmpp,cors,strophe,Xmpp,Cors,Strophe,我正在尝试JackMoffit的书中的一个例子:使用JavaScript和jQuery进行专业的XMPP编程。具体来说,我正在尝试第3章中的hello world应用程序,该应用程序应该使用bosh通过web界面登录到xmpp服务器。我已经从下载了所有必要的代码 当我在Chrome中打开Hello.html文件并打开JavaScript控制台时,没有问题,因此文件中引用的脚本和css文件似乎已成功加载 这是Hello.html文件: <!DOCTYPE HTML PUBLI

我正在尝试JackMoffit的书中的一个例子:使用JavaScript和jQuery进行专业的XMPP编程。具体来说,我正在尝试第3章中的hello world应用程序,该应用程序应该使用bosh通过web界面登录到xmpp服务器。我已经从下载了所有必要的代码

当我在Chrome中打开Hello.html文件并打开JavaScript控制台时,没有问题,因此文件中引用的脚本和css文件似乎已成功加载

这是Hello.html文件:

        <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
              "http://www.w3.org/TR/html4/strict.dtd">
    <html>
      <head>
        <title>Hello - Chapter 3</title>

        <link rel='stylesheet' href='http://ajax.googleapis.com/ajax/libs/jqueryui/1.7.0/themes/cupertino/jquery-ui.css'>
        <script src='http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.js'></script>
        <script src='http://ajax.googleapis.com/ajax/libs/jqueryui/1.7.2/jquery-ui.js'></script>
        <script src='../scripts/strophe.js'></script>
        <script src='../scripts/flXHR.js'></script>
        <script src='../scripts/strophe.flxhr.js'></script>

        <link rel='stylesheet' href='hello.css'>
        <script src='hello.js'></script>
      </head>
      <body>
        <h1>Hello</h1>

        <div id='log'>
        </div>

        <!-- login dialog -->
        <div id='login_dialog' class='hidden'>
          <label>JID:</label><input type='text' id='jid'>
          <label>Password:</label><input type='password' id='password'>
        </div>
      </body>
    </html>

你好-第三章
你好
JID:
密码:
这是hello.js:

        var Hello = {
        connection: null,
        start_time: null,

        log: function (msg) {
            $('#log').append("<p>" + msg + "</p>");
        },

        send_ping: function (to) {
            var ping = $iq({
                to: to,
                type: "get",
                id: "ping1"}).c("ping", {xmlns: "urn:xmpp:ping"});

            Hello.log("Sending ping to " + to + ".");

            Hello.start_time = (new Date()).getTime();
            Hello.connection.send(ping);
        },

        handle_pong: function (iq) {
            var elapsed = (new Date()).getTime() - Hello.start_time;
            Hello.log("Received pong from server in " + elapsed + "ms.");

            Hello.connection.disconnect();

            return false;
        }
    };

    $(document).ready(function () {
        $('#login_dialog').dialog({
            autoOpen: true,
            draggable: false,
            modal: true,
            title: 'Connect to XMPP',
            buttons: {
                "Connect": function () {
                    $(document).trigger('connect', {
                        jid: $('#jid').val(),
                        password: $('#password').val()
                    });

                    $('#password').val('');
                    $(this).dialog('close');
                }
            }
        });
    });

    $(document).bind('connect', function (ev, data) {
        var conn = new Strophe.Connection(
            "http://bosh.metajack.im:5280/xmpp-httpbind");
        conn.connect(data.jid, data.password, function (status) {
            if (status === Strophe.Status.CONNECTED) {
                $(document).trigger('connected');
            } else if (status === Strophe.Status.DISCONNECTED) {
                $(document).trigger('disconnected');
            }
        });

        Hello.connection = conn;
    });

    $(document).bind('connected', function () {
        // inform the user
        Hello.log("Connection established.");

        Hello.connection.addHandler(Hello.handle_pong, null, "iq", null, "ping1");

        var domain = Strophe.getDomainFromJid(Hello.connection.jid);

        Hello.send_ping(domain);

    });

    $(document).bind('disconnected', function () {
        Hello.log("Connection terminated.");

        // remove dead connection object
        Hello.connection = null;
    });
var Hello={
连接:空,
开始时间:空,
日志:函数(msg){
$('#log')。追加(“”+msg+”

”); }, 发送:功能(到){ var ping=$iq({ 致:致,, 键入:“获取”, id:“ping1”}.c(“ping”,{xmlns:“urn:xmpp:ping”}); Hello.log(“发送ping到“+到+”); Hello.start_time=(新日期()).getTime(); 你好。连接。发送(ping); }, 手柄:功能(iq){ var appead=(new Date()).getTime()-Hello.start\u time; Hello.log(“在“+appeased+”ms.”中接收到来自服务器的pong”; Hello.connection.disconnect(); 返回false; } }; $(文档).ready(函数(){ $(“#登录对话框”)。对话框({ 自动打开:对, 可拖动:错误, 莫代尔:是的, 标题:“连接到XMPP”, 按钮:{ “连接”:函数(){ $(document).trigger('connect'{ jid:$('#jid').val(), 密码:$('#password').val() }); $('#password').val(''); $(this.dialog('close'); } } }); }); $(文档).bind('connect',函数(ev,数据){ var conn=新选通连接( "http://bosh.metajack.im:5280/xmpp-httpbind); 连接(data.jid、data.password、函数(状态){ 如果(状态===Strophe.status.CONNECTED){ $(document.trigger('connected'); }否则如果(状态===选通状态.断开){ $(document.trigger('disconnected'); } }); Hello.connection=conn; }); $(文档).bind('connected',函数(){ //通知用户 Hello.log(“已建立连接”); Hello.connection.addHandler(Hello.handle_pong,null,“iq”,null,“ping1”); var domain=Strophe.getDomainFromJid(Hello.connection.jid); 您好,发送\u ping(域); }); $(文档).bind('disconnected',函数(){ Hello.log(“连接终止”); //删除死连接对象 Hello.connection=null; });
基本上,它所做的是通过运行在的BOSH服务连接到XMPP服务器。当它连接时,它使用jQuery将“连接已建立”打印到html文件中

但是,我无法将其连接到服务器。我已经在
http://bosh.metajack.im:5280/xmpp-httpbind
已启动并运行。我已经在alpha-labs.net和jabber.de上创建了xmpp帐户。这两个帐户都在我的Windows机器上使用pidgin IM。但我无法使用此示例登录这些帐户中的任何一个

当我输入我的jid时,例如justastest@alpha-net和相应的密码,屏幕上不会打印任何内容

我也在这本书的出版商的论坛上发过帖子,但这本书的读者并不多,所以我想我应该在这里试试

谢谢你的帮助

C

编辑:所以我把范围缩小了一点,在其他人的帮助下,我确定这可能是CORS的问题。到目前为止,我一直在本地使用web浏览器访问Hello.htmlfile:///. 在这种情况下,我无法连接到任何服务器

但是,如果我在服务器上托管Hello.html/Hello.js,然后通过我的web浏览器使用http访问该版本,则代码可以工作,即可以建立服务器连接


我不太明白,为什么这是个问题。如果我在本地访问它,为什么它不起作用?我是否可以以某种方式使它在本地场景中也起作用?

要启用CORS功能,您必须从web服务器而不是从文件运行本地站点

基本上,因为您网站的来源是一个文件而不是一个web url,所以当CORS机制试图确定是否应该允许请求时,它会与
null
进行比较。这个问题似乎只会影响某些浏览器(chrome)。显然,简单的修复方法是从本地web服务器运行html文件