【问题标题】:How to detect mixed content with angularjs?如何使用 angularjs 检测混合内容?
【发布时间】:2016-02-24 10:41:29
【问题描述】:

我有一个angularjs 应用程序在tomcat 上运行,在loadbalancer 后面运行

如果通过负载均衡器使用https 请求应用程序,那么均衡器仍然会在内部通过http 请求应用程序,当然。

问题:在这种情况下,我想隐藏一个显示混合内容的选项卡(因为我必须嵌入不支持 https 的外部 pdf 链接,因此我想隐藏它们)。

我无法使用$location.protocol(),因为该应用位于负载均衡器后面,并且始终只能获得http

问题:我是否有可能检测到浏览器是否实际显示mixed content

【问题讨论】:

  • 但该应用程序正在客户端 Web 浏览器中运行,该浏览器通过 https 请求页面。没关系,在您的网络内部,它是通过 http 下载的。
  • 你不明白我的意思:webapp 将包含不支持 https 的嵌入式资源/链接。因此我们有一个混合内容问题,因此我想检测它。我无法通过协议检测到它位于负载均衡器后面。

标签: javascript angularjs


【解决方案1】:

您无法以简单的方式检测到它。您可以尝试在 iframe 上监听 load 事件并设置超时,当超时触发时,阻止 iframe,因为 iframe 没有像这样加载(jsfiddle example):

checkMixedContent(urlToCheck, function(urlToCheck) {
    // For example, change location
    alert('ok');
    // load iframe
}, function() {
    alert('Error: resource timed out');
    // hide iframe / show message
}, checkDelay);

function checkMixedContent(urlToCheck, successCallback, errorCallback, checkDelay, dontCheckOnError) {
    checkDelay = checkDelay || 10000;
    // 1. Create invisible iframe and append it to body
    var iframeHelper = document.createElement("iframe");
    iframeHelper.src = urlToCheck;
    iframeHelper.height = 0;
    iframeHelper.width = 0;
    iframeHelper.style.visibility = 'hidden';
    document.body.appendChild(iframeHelper);

    // 2. Set time out and while content on iframeHelper.src should be definitely loaded
    var checkTimeout = window.setTimeout(function() {
        errorCallback(urlToCheck);
    }, checkDelay);

    var onLoad = function() {
        window.clearTimeout(checkTimeout); // if OK - not show error => clearTimeout

        iframeHelper.removeEventListener('load', onLoad);
        iframeHelper.removeEventListener('error', onError);
        document.body.removeChild(iframeHelper);
        successCallback(urlToCheck);
    };

    var onError = function() {
        window.clearTimeout(checkTimeout); // if OK - not show error => clearTimeout

        iframeHelper.removeEventListener('load', onLoad);
        iframeHelper.removeEventListener('error', onError);
        document.body.removeChild(iframeHelper);
        errorCallback(urlToCheck);
    };

    // 3. If everything is fine - "load" should be triggered
    iframeHelper.addEventListener('load', onLoad);


    // Turn "true" in case of "X-Frame-Options: SAMEORIGIN"
    if (!dontCheckOnError) {
        iframeHelper.addEventListener('error', onError);
    }

}

【讨论】:

  • 仅供参考,我认为这实际上不会起作用,因为当您将 iframe 指向例如如果 iframe 位于 HTTPS 网页内的 HTTP URL,onload 事件仍会触发。您在 javascript 控制台中收到“混合内容”错误,但它仍然会触发 iframe 的 onload 事件并且它确实触发 iframe 的 onerror 事件。基本上是检测不到的。这是 Chromium 项目中标记为 WONTFIX 的错误票:bugs.chromium.org/p/chromium/issues/detail?id=365457
  • @jangosteve 谢谢你的信息,那是很久以前的事了,我不记得细节了......但是有一个例子jsfiddle.net/L6rj2deh/2,它不叫“加载”。超时后调用错误回调
  • @jangosteve 只需在 https jsfiddle 上运行他们的示例:jsfiddle.net/xLcbL。他们在 http 上提供了它。该票通常是关于“无效的 URL”的。如果我们在“https”中有body,在“http”中有iframe,它就不会调用“onload”。
猜你喜欢
  • 2017-06-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-31
  • 1970-01-01
  • 2017-08-06
  • 1970-01-01
  • 2016-06-22
相关资源
最近更新 更多