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”网站询问访问权限;认答案是“否”,但这是浏览器强制执行该规则,而不是服务器.

相关文章

前言 做过web项目开发的人对layer弹层组件肯定不陌生,作为l...
前言 前端表单校验是过滤无效数据、假数据、有毒数据的第一步...
前言 图片上传是web项目常见的需求,我基于之前的博客的代码...
前言 导出Excel文件这个功能,通常都是在后端实现返回前端一...
前言 众所周知,js是单线程的,从上往下,从左往右依次执行,...
前言 项目开发中,我们可能会碰到这样的需求:select标签,禁...