5

如您所知,出于安全原因,在 Internet Explorer 下不允许执行跨域 XMLHTTP 请求。

我有一个 WebBrowser 控件,我正在使用DocumentText而不是NavigateURL。由于当前域是about:blank页面尝试向自身或其他域发出请求时,我收到了Access is deniedJavascript 错误。

即使我使用NavigateJavascript 向另一个域发出请求,它也不起作用。

我怎样才能解决这个问题?

此 HTML 代码应与 WebBrowser 控件一起使用:

<body>

<a href="javascript:getit('http://www.google.com')">this should work</a>
<div id="x"></div>

</body>

<script>
function XHConn()
{
  var xmlhttp, bComplete = false;
  try { xmlhttp = new ActiveXObject("Msxml2.XMLHTTP"); }
  catch (e) { try { xmlhttp = new ActiveXObject("Microsoft.XMLHTTP"); }
  catch (e) { try { xmlhttp = new XMLHttpRequest(); }
  catch (e) { xmlhttp = false; }}}
  if (!xmlhttp) return null;
  this.connect = function(sURL, sMethod, sVars, fnDone)
  {
    if (!xmlhttp) return false;
    bComplete = false;
    sMethod = sMethod.toUpperCase();

    try {
      if (sMethod == "GET")
      {
        xmlhttp.open(sMethod, sURL+"?"+sVars, true);
        sVars = "";
      }
      else
      {
        xmlhttp.open(sMethod, sURL, true);
        xmlhttp.setRequestHeader("Method", "POST "+sURL+" HTTP/1.1");
        xmlhttp.setRequestHeader("Content-Type",
          "application/x-www-form-urlencoded");
      }
      xmlhttp.onreadystatechange = function(){
        if (xmlhttp.readyState == 4 && !bComplete)
        {
          bComplete = true;
          fnDone(xmlhttp);
        }};
      xmlhttp.send(sVars);
    }
    catch(z) { return false; }
    return true;
  };
  return this;
}

function getit(url){
    var xmlhttp = new XHConn();
    var fnWhenDone = function (oXML) { document.getElementById('x').innerHTML = oXML.responseText; alert(oXML.responseText); };
    xmlhttp.connect(url, "GET", "", fnWhenDone);
}

</script>
4

5 回答 5

6

我找到了一个肮脏的解决方法,加载一个本地 HTML (c:\temp\temp.html),然后通过 javascript 修改它的内容。

在这一点之后,不再有跨域限制,但是使用 document.write 会导致其他讨厌的问题,例如 JQuery.ready函数将不起作用。

于 2009-03-06T11:29:05.260 回答
1

检查一下,它对我来说就像一个魅力。 http://support.microsoft.com/default.aspx?scid=kb;en-us;246227

于 2009-12-07T02:38:17.663 回答
0

我不明白您在哪个域上无权访问 Javascript...您是否尝试过使用脚本标签从其他域获取您想要的数据?您可以使用JSONP习惯用法来命名数据...

var head = document.getElementsByTagName("head")[0];
var script = document.createElement("script");
script.src = "anotherdomain.com/data?callback=myFunction";
head.appendChild(script);

然后在“/数据”上:

myFunction({
    // data here
});
于 2009-01-07T15:36:32.047 回答
0

URLACTION-CROSS-DOMAIN-DATA 似乎是正确的方向: 阅读此内容以了解原因

于 2009-03-20T19:26:25.493 回答
0

做到这一点的唯一方法是确保您的代码在可信区域(或更高级别的 HTA)中运行。默认情况下,在 WebBrowser 控件中运行的任何内容都在所提供文件的来源区域中运行。(即正在使用标准的 IE 安全策略。)

要更改此行为,您需要更改托管 WebBrowser 控件的应用程序并在该 WebBrowser 控件上实现一些接口。(IInternetHostSecurityManager、IInternetZoneManager 和 IInternetSecurityMgrSite 是您应该查看的。)这不是一项简单的任务,而且关于此的文档充其量是稀缺的。

完成此操作后,您的代码可以使用所需的任何权限运行,跨域请求就像重置 Mime-Sweeper 高分一样简单。

希望这可以帮助。

于 2009-03-22T18:09:10.593 回答