【问题标题】:How to find out whether a URL is up and running?如何确定 URL 是否已启动并正在运行?
【发布时间】:2015-04-27 07:09:39
【问题描述】:

我有四个 URL,我正在尝试构建一种简单的 HTML-JavaDcript 方法来确定这些 URL 是否已启动并正在运行。

网址是这样的:

  • https://www.kbhome1.com
  • https://www.kbhome2.com
  • https://www.kbhome3.com
  • https://www.kbhome4.com

现在,当使用 IE 中的地址栏加载 URL 时,它们都提供了一个通用文本,该文本与使用的 URL 有一些变化,如下所示:

  • Your app1 is up and running
  • Your app2 is up and running
  • Your app3 is up and running
  • Your app4 is up and running

所以我试图在 iframe 中加载 URL,然后我试图获取公共文本 Your app,这将让我知道各个 URL 已启动。现在的问题是 URL 托管在不同的服务器中,因此由于Same Origin Policy violation,我不断收到此错误:

iframe 错误权限被拒绝访问属性

现在有没有人知道任何其他方式来实现我想要做的事情?任何帮助都深表感谢。

【问题讨论】:

    标签: javascript url iframe


    【解决方案1】:

    几个选项供您选择:

    1. 听起来您打开了 iframe,其中加载了这些 URL。您可以通过postMessage(允许跨域)向 iframe 窗口发送消息,并让他们回复说他们是否已启动。例如,在您的主窗口中:

      window.addEventListener("message", function(e) {
          // Check iframe reply's origin and handle it here
      }, false);
      
      theIframe.contentWindow.postMessage("ack", "https://kbhome1.com");
      

      在那里,您正在收听一条消息,并向 iframe 发送一条消息,要求它回复。

      更多关于postMessage

    2. 但它不需要那么复杂。如果您只想确保这些应用程序已启动,请在每个应用程序上放置一个小脚本文件,例如https://kbhome1.com/up.js,里面有这个:

      hostStatus("kbhome1", true);
      

      ...然后在您的页面上包含一个函数:

      function hostStatus(host, up) {
          // ...mark that host as "up" or "down" based on the `up` flag
      }
      

      ...并为每个主机添加一个脚本标签:

      var script = document.createElement('script');
      script.src = "https://kbhome1.com/up.js";
      script.onerror = function() {
          hostStatus("kbhome1", false); // It's not up
      };
      document.querySelector("script").parentNode.appendChild(script);
      

      如果您看到hostIsUp 电话,那就是电话;如果你不这样做,那就不是(我们可以使用上面的error 事件来获得肯定的“它没有启动”结果)。

      如果您正在创建一个持续的“实时”状态页面,则可以多次执行此操作。

    【讨论】:

    • 谢谢,这看起来是个好主意。让我看看这是否适合我。
    • 所以,这两个选项的问题在于它们取决于我对 urls 的控制权。不幸的是,这些 url 托管在我无权访问的服务器中。当我尝试第一个选项时,我意识到 receiveMessage() 函数必须位于托管 URL 的应用程序上。但这在我的情况下是不可能的,因为我无权更改该应用程序中的任何内容,并且从我的代码方面,我无论如何都无法访问通过 urls 描述的网页内的任何内容。因此,这些选项都没有真正适合我。
    • 但我不知道postmessage() 功能。不过那是一本好书。如果您能想到其他方法,请告诉我。
    • @TheDarkKnight:如果您无法控制要查看的网站的内容,我认为没有纯粹的客户端解决方案。你必须在某个地方有一个服务器可以查询,它可以反过来查询你正在测试的主机(因为服务器端代码不会违反同源策略)。
    • 是的,你说的很对。但是,我现在想的是:由于我无法访问 iframe 内的任何内容;如果我以语法方式拍摄 iframe 内容的快照并从中提取文本 Your app 会怎样。如果我能够提取文本,则意味着该站点已启动。只是一个想法,但不知道这其中的复杂性。
    【解决方案2】:

    您可以尝试向这些 URL 中的每一个发送简单的 AJAX GET 请求,然后查看是否返回 200 状态。

    同样,对于您可以尝试使用 jsonp 数据类型的跨域问题,这可能会失败。

    【讨论】:

    • 你有使用 jsonp 的示例吗?
    猜你喜欢
    • 2021-04-09
    • 2012-09-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多