微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

javascript – node.js https请求和XMLHttpRequest之间有什么区别?

通过node.js模块发送的HTTPS请求与 XMLHttpRequest之间有什么区别?

我正在尝试向amazon aws发送HTTPS GET请求以从javascript(XMLHttpRequest)获取安全令牌,并且始终失败并且“Access-Control-Allow-Origin不允许使用Origin http://my_ip”,但是如果我发送相同的HTTPS GET通过node.js模块请求它工作正常.

我对此感到困惑,因为如果服务器确实支持CORS,那么来自任何地方的任何请求都应该失败,但是它通过node.js,但不是通过XMLHttpRequest.

这个失败

var url_ = "https://sts.amazonaws.com/?Action=GetSessionToken" +
            "&DurationSeconds=3600" +
            "&AWSAccessKeyId=XXXXXXXXXXXXXXX" +
            "&Version=2011-06-15" +
            "&Timestamp=" + encode(timestamp) +
            "&Signature=" + encode(hash) +
            "&Signatureversion=2&SignatureMethod=HmacSHA256";

// Simple GET request
$.get(url_,function(data) {
    alert("response: " + data);
});

这个工作

var https = require('https');
var options = {
    host    : 'sts.amazonaws.com',method  : 'GET',path    : '/?Action=GetSessionToken' +
              '&DurationSeconds=3600' +
              '&AWSAccessKeyId=XXXXXXXXXXXXXX' +
              '&Version=2011-06-15' +
              '&' + timestamp +
              '&' + signature +
              '&Signatureversion=2&SignatureMethod=HmacSHA256'
};

https.get(options,function(res) {
    res.on('data',function(d) {
        process.stdout.write(d);
    });    
}).on('error',function(e) {
    console.error(e);
});

有谁能解释我这是如何工作的?

解决方法

浏览器受 Same Origin Policy的限制.Node.js不受限制.

也就是说,浏览器将允许脚本通过XHR仅向与加载脚本的页面相同的域中的站点发出HTTP请求.但是,Node.js将允许对任何域的HTTP请求.

(现在使用CORS的浏览器故事稍微复杂一些,但它仍然是这里的基本问题.)

编辑 – 详细说明,现在我已经重新阅读了你的问题:CORS是一个合作协议.互联网上的服务器通常会向任何人提供内容;这就是运行Web服务器的重点.除非请求者询问,否则CORS与HTTP请求无关.如果您有URL“http://x.y.z/something”,并将其输入浏览器的地址栏,那么浏览器将毫不犹豫地向该站点发出HTTP请求.当来自另一个域(而不是“x.y.z”)的站点页面中的某些代码尝试通过XHR运行HTTP请求时,同源策略(和CORS)才会发挥作用.在这种情况下,浏览器会向“x.y.z”网站询问访问权限;认答案是“否”,但这是浏览器强制执行该规则,而不是服务器.

原文地址:https://www.jb51.cc/js/159297.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐