如何检测客户端是否可以访问iFrame中的网站?

时间:2012-10-30 23:11:57

标签: c# javascript jquery asp.net ajax

我目前有一个网站,在某些地方使用iFrame从我们的内部网加载页面(这是不可避免的)。我想要做的是能够检测客户端是否能够从其当前位置访问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地址,如果可能的话。

我的另一个选择是在无法联系内联网网站时进行自定义404页面,但我不确定我是否可以这样做(或者如果我可以这样做)。

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

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

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

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

1 个答案:

答案 0 :(得分:1)

由于您的Intranet网址与主网页位于不同的主机网域,因此页面上运行的JavaScript无法直接确定iframe内部的内容。如果iframe无法联系Intranet站点,则由于主机域不同,外部页面将不会显示错误状态。

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

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

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

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

如果主机页面看到iframe高度已更改为奇数,则表示您已成功加载Intranet页面。

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

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