【问题标题】:Cross domain requests not working跨域请求不起作用
【发布时间】:2014-11-06 00:43:25
【问题描述】:

我有一个 java 服务,使用 xmlHttpRequest 在 javascript 中调用它,它返回 XML 数据。它在 IE 8 之前运行良好。现在我们在 IE 11、chrome 和 mozilla 中尝试它给出 500 (Internal Server Error)。代码如下。

request = new XMLHttpRequest();
request.open('POST', SERVERHOSTNAME+"/XXXXXX/XXXXXX/XXXXX/XXXXXInsert");
request.send(req,300000);

谷歌搜索后发现它与跨域请求有关,并使用以下代码。

request.setRequestHeader("Access-Control-Allow-Origin", SERVERHOSTNAME);

在上面的代码中添加了这一行..现在我没有收到任何错误,也没有输出我的 reponseText 为空.. 后来我尝试了$.ajax 代码如下:

$.ajax({
    url:url,
    type: "POST",
    data:req,
    dataType:"xml",
    crossDomain:true,
    success: function (response) {
        alert(response);
    },
    error:function(error1)
    {
        alert(error1);
    }
});

我遇到同样的错误...请帮助我。一件事是我现在无法更改服务..

【问题讨论】:

  • allow cross browser request in crome .. check similar question.. stackoverflow.com/questions/2600574/….. 使用 --disable-web-security 作为参数启动 crome.exe 即“chrome.exe --disable-web -安全”
  • 感谢 girish 的回复。我无法使用此选项,因为我无法让所有用户都以这种模式启动它。
  • Access-Control-Allow-Originresponse 标头,而不是请求标头。

标签: javascript jquery ajax xmlhttprequest


【解决方案1】:

实际上,设置标题的人不是你。服务器应在响应中设置标头Access-Control-Allow-Origin: *

浏览器看到您正在发送跨域请求。由于 CSRF 和 XSS 等跨域请求存在安全问题,浏览器通过发送另一个请求并检查响应标头来检查服务器是否允许跨域请求。如果服务器没有,浏览器会显示错误。如果服务器这样做,它会发送您的请求并获得响应。在您的情况下,我认为服务器没有在响应中设置标头..

您可以联系服务器管理员并要求他们从服务器端设置该标头。否则你可以试试 JSONP。 Basic example of using .ajax() with JSONP?

【讨论】:

  • 同源策略与XSS无关,与CSRF关系不大。
  • XSS 和 CSRF 攻击都依赖于服务器对提交的数据进行处理。虽然同源策略将(在仅需要预检 OPTIONS 检查的复杂请求的情况下)阻止攻击者使用 XHR 执行这些操作,但它不会阻止他们制作 <form> 并使用 JS 提交它.同源策略可防止攻击者读取对不同源的请求的响应。它可以保护浏览器用户和发出请求的站点之间的私有数据。
  • 与使用 XHR 提交相比,不使用 XHR 提交精心制作的表单并不是很危险。页面将重新加载,用户将被重定向到操作 url。但如果使用 XHR 完成,被攻击的用户几乎不会注意到。由于同源策略,攻击者必须从同一个域中找到漏洞才能执行 XSS 或 CSRF 攻击。但是如果没有同源策略,攻击者可以利用一个域的漏洞来利用另一个域(如果 XHR 请求是到 x,而 origin 是 y,则浏览器发送 x 的 cookie 而不是 y 的 cookie)
  • “它可以保护浏览器用户和请求被发送到的站点之间的私有数据”。你能再解释一下吗?
  • Alice 使用她的网上银行,该网上银行由 Bob 运营的网站处理。 Alice 访问了 Mallery 的网站。 Mallery 的网站将 JavaScript 发送到 Alice 的浏览器,使其向 Bob 的网站发出请求。同源策略阻止 Mallery 的 JavaScript 读取 Bob 网站上的数据(这将是 Alice 的银行账户详细信息)。
【解决方案2】:

对我有帮助的单行是添加

request = new XMLHttpRequest();
request.open('POST', SERVERHOSTNAME+"/XXXXXX/XXXXXX/XXXXX/XXXXXInsert");
request.setRequestHeader("Content-Type", "text/xml; charset=utf-8");
request.send(req,300000);

我发现500错误不仅与跨域有关,甚至与其他事物有关..

【讨论】:

    【解决方案3】:

    请尝试在后端调试您的代码。

    在调用 AJAX 调用中 URL 引用的脚本时创建一个断点。我相信这会启发你的问题。

    如果您在后端的脚本没有触发调试,那么您的 AJAX 调用有问题,或者您的其他 JS 脚本可能有问题。

    【讨论】:

      猜你喜欢
      • 2014-04-18
      • 1970-01-01
      • 2014-02-09
      • 2023-03-17
      • 1970-01-01
      • 2013-07-02
      • 1970-01-01
      • 2015-01-26
      • 2014-10-04
      相关资源
      最近更新 更多