【问题标题】:How to get the status code of a JavaScript auto-POST to another domain如何获取 JavaScript 自动 POST 到另一个域的状态代码
【发布时间】:2012-08-24 21:47:21
【问题描述】:

我们正在构建一个 SAML 解决方案,其中一个阶段涉及我们提供一个预先填充了各种参数的 html 表单,设置为 POST 到独立于我们的 Web 服务上的端点。然后通过 JavaScript 自动提交此表单。 (即这是 SAML POST 绑定)

对于调试,如果我们能查明这个自动 POST 是否成功,那将是非常有用的。有人对我们如何做到这一点有任何想法吗?仅仅能够获取 HTTP 状态代码,或者能够找出请求是否超时,将非常有帮助。

目前进展:

据我所知,没有办法直接检查提交表单的实际结果,而且我认为您无法从 onunload 事件中获取下一个请求的状态。

我们准备对其进行重组,改为使用 AJAX 进行 POST,但我认为我们无法针对其他端点的域进行这项工作。我也想知道我们是否可以在一个框架中加载另一个页面并以某种方式获取一些信息,但我知道它也有自己的一组跨域限制。

最后我们可以尝试先在服务器端进行 POST 并对其进行分析,但我们所访问的服务器很可能位于仅对客户端本地可用的网络上,因此这可能只是不可行的,此外重放等各种问题。

任何想法或解决方案都会非常有用!

【问题讨论】:

    标签: javascript ajax http xss saml


    【解决方案1】:

    为了测试,浏览器的内置调试怎么样? Chrome 可让您查看所有 Web 请求,包括标头 (described here),Firebug 也有类似的东西。

    如果您不仅要在测试期间了解结果,而且要从用户那里获取 POST 成功状态,那么我认为跨域限制太强了,除非:

    • 第三方服务提供了某种“有效”的 URL,您可以使用 JSONP 访问
    • 第三方服务配置为允许使用 CORS 的跨站点 AJAX (MDN docs)

    【讨论】:

    • 我们在开发过程中一直在使用它,但我们很快就会部署它,使用浏览器的人是我们的客户。我们正试图达到一个位置,如果他们在执行 POST 时出错,我们可以将快速 AJAX 请求发送到我们端某处的端点,并记录它失败的事实,以及我们试图发送的数据.
    • 嗯,我不确定你能做些什么。有没有办法查询第三方网络服务是否成功?如果是这样,您可以等待 10 秒左右,然后使用 JSONP 或其他方式检查其他 URL。不理想,但是...
    【解决方案2】:

    以下是 AJAX 请求的基本示例:

    var xmlhttp;
    if (window.XMLHttpRequest)
        xmlhttp=new XMLHttpRequest();
    else
        xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
    
    xmlhttp.onreadystatechange=function()
    {
        if (xmlhttp.readyState==4 && xmlhttp.status==200)
            document.getElementById("myDiv").innerHTML=xmlhttp.responseText;
    }
    xmlhttp.open("GET","ajax_info.txt",true);
    xmlhttp.send();
    

    注意xmlhttp.status == 200 所在的行。您应该能够检查此变量以查看 AJAX 调用返回的状态。所以你可以这样做:

    var xmlhttp;
    if (window.XMLHttpRequest)
        xmlhttp=new XMLHttpRequest();
    else
        xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
    
    xmlhttp.onreadystatechange=function()
    {
        console.log("STATUS = "+ xmlhttp.status);
    }
    xmlhttp.open("GET","ajax_info.txt",true);
    xmlhttp.send();
    

    这就是你要找的吗?

    【讨论】:

    • 问题是我们发布到的站点在另一个域上,我很确定同源策略会使这些跨域 AJAX 请求在浏览器中总是失败。有办法解决吗?
    • 您可能已经比我了解更多...但是您了解 crossdomain.xml 文件吗?我知道对于我正在处理的项目,我需要目标服务器上的 crossdomain.xml 文件才能从源服务器进行 AJAX 调用。如果您不了解 crossdomain.xml 文件,只需 Google 一下,您就会获得大量有关它的信息。抱歉,如果我对此感到不满意。就像我说的,我可能在这方面超出了我的水平。
    • 我没有意识到 crossdomain.xml 也用于 AJAX 请求 - 我认为这只是 Adob​​e 的东西。
    • @cloudfeet:实际上,您可能是对的。现在回想起来,我可能使用 crossdomain.xml 从 Flash 进行跨域调用。 This post 提供了一个很好的解决方案...
    • @Travesty3 取决于 POST 的实际作用。如果是身份验证,那么它可能会在另一个域上设置一个 cookie,而使用 PHP 代理不会保留。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-09-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多