【问题标题】:How to detect if client can access website in an iFrame?如何检测客户端是否可以访问 iFrame 中的网站?
【发布时间】:2012-10-30 23:11:57
【问题描述】:

我目前有一个网站,在某些地方使用 iFrame 从我们的 Intranet 加载页面(这是不可避免的)。我想要做的是能够检测客户端是否能够从其当前位置访问 Intranet 页面。我有以下代码,但显然它只检查服务器是否可以联系 Intranet(剧透警报:它完全可以)。

public bool IsAvailable()
    {
        HttpWebRequest httpReq = (HttpWebRequest)WebRequest.Create("http://localintranetsite/");
        httpReq.AllowAutoRedirect = false;

        try
        {
            HttpWebResponse httpRes = (HttpWebResponse)httpReq.GetResponse();
            if (httpRes.StatusCode == HttpStatusCode.NotFound)
                return false;
            else
                return true;
        }
        catch
        {
            return false;
        }
    }

当然,如果可能的话,我希望能够做到这一点,而不必依赖检测网站用户的 IP 地址。

当无法联系到 Intranet 站点时,我的另一个选择是创建一个自定义 404 页面,但我不确定我能否做到这一点(或者如果我能做到的话,我会怎么做)。

如果加载 iFrame 的代码在从 javascript 调用的 Web 服务中有所不同,那么虽然我的 Web 服务中的 asp.net 解决方案是理想的,但 javascript 函数也可以工作。

我(没有帮助)当前的解决方案尝试检查是否可以访问 Intranet 站点,但它只能检查 Web 服务器是否可以访问它,而不是客户端。

对于那些好奇的人,这是 javascript(通过 jQuery)方式(它不起作用,因为它是跨域的):

    $.ajax({
        type: 'HEAD',
        url: 'http://intranetsite/',
        success: function () {
            local = true;
        },
        error: function () {
            local = false;
        }
    })

【问题讨论】:

    标签: c# javascript jquery asp.net ajax


    【解决方案1】:

    由于您的 Intranet url 与主页位于不同的主机域中,因此页面上运行的 JavaScript 无法直接确定 iframe 内部发生的情况。如果 iframe 无法联系到内网站点,由于主机域的不同,错误状态对外部页面将不可见。

    但是,即使在跨域情况下,iframe 也可以通过多种方式向主机页面公开数据。例如,可以从 iframe 内部或外部对 iframe 的宽度或高度进行更改,并且可以从两侧看到。

    一种解决方案可能是将一些 JavaScript 代码添加到您从 Intranet 站点加载到 iframe 的 html 页面中,以将 iframe 的宽度或高度设置为特殊值。如果 iframe 在主机页面上不可见,则可以将宽度和高度设置为所需的任何整数值。如果 iframe 确实需要可见,您可以通过将宽度或高度设置为偶数或奇数值来跨边界传递布尔信息。

    因此,例如,让 Intranet 网页通过在页面加载时将其增加为奇数来修改其高度。

    让主机页面中的 JavaScript 将 iframe 的初始高度设置为偶数,然后将 Intranet URL 分配给 iframe.src 属性。经过一段时间后,让主机页面 JavaScript 检查 iframe 高度。如果 iframe 高度仍然是之前的高度,则 URL 尚未加载。如果过了很长时间,那么 URL 没有加载可能是因为客户端无法访问 Intranet 站点。

    如果宿主页面看到iframe高度变成奇数,就知道内网页面加载成功了。

    这种方法不会提供明确的失败信号,但应该提供明确的成功信号。

    如果您需要支持的浏览器足够现代,您可能会考虑使用 HTML5 window.postMessage 在同一浏览器内跨域边界的 DOM 元素之间进行通信。 https://developer.mozilla.org/en-US/docs/DOM/window.postMessage

    【讨论】:

    • +1。请注意,postMessage 在 IE8 及更高版本中可用,因此除非您必须支持 IE6/7,否则它是在不同域的框架之间进行通信的最佳方法。
    • 感谢您的反馈 - 不幸的是,我可能不得不在无法访问其他 Intranet 站点的情况下执行此操作。据我了解,我们托管它,其他人运行它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-10-30
    • 1970-01-01
    • 1970-01-01
    • 2021-05-24
    • 1970-01-01
    • 2021-10-14
    • 2014-06-29
    相关资源
    最近更新 更多