JSONP请求跨域工作,但无法弄清楚原点

时间:2012-11-25 18:23:27

标签: node.js express cross-domain jsonp cors

我正在尝试JSONP调用。我在域domain1.com下的服务器1中有一个NodeJs应用程序,如下所示:

server.get('/api/testjsonp', function(req, res) {

  var clientId = req.param('clientId');

  res.header('Content-Type', 'application/json');
  res.header('Charset', 'utf-8') 
  res.send(req.query.callback + '({"something": "rather", "more": "fun",
          "sourceDomain": "' + req.headers.origin + '"' + ',"clientId":"' + clientId + 
          '"});');  

});

在另一个服务器(服务器2)和不同的域(domain2.com)下,我创建了一个测试html页面,调用如下:

    var data = { clientId : 1234567890 };

            $.ajax({
                    dataType: 'jsonp',
                    data: data,
                    jsonp: 'callback',
                    url: 'https://domain1.com/api/testjsonp?callback=1',                        
                    success: function(data) {
                        alert('success');
                    },
        error: function(err){
                        alert('ERROR');
                        console.log(err);
                    }
                });

我有两个问题:

1)为什么这样有效?这不是一个跨域调用,因此我需要实现ALLOW-ORIGIN标头的东西吗?我正在关注这个例子:

http://css.dzone.com/articles/ajax-requests-other-domains

http://benbuckman.net/tech/12/04/cracking-cross-domainallow-origin-nut

2)在服务器中,我无法确定哪个域正在进行调用,req.headers.origin始终未定义。我希望能够知道哪个域名正在呼叫,以防止不必要的呼叫。替代方案我可以检查呼叫IP,任何想法如何?

非常感谢

1 个答案:

答案 0 :(得分:0)

  

为什么这样有效?这不是一个跨域调用,因此我需要实现ALLOW-ORIGIN标头的东西吗?我

就浏览器而言,您不是直接从不同的来源读取数据。您正在从另一个来源加载JavaScript程序(它碰巧捆绑了一些数据)。

  

在服务器中,我无法确定哪个域正在进行调用,req.headers.origin始终未定义。我希望能够知道哪个域名正在呼叫,以防止不必要的呼叫。

引用页面的URL存储在Referer标头中,而不是Origin标头中。但是,它是可选的,在许多情况下不会发送。

如果要限制对某些站点的数据访问,则不能使用JSON-P。请改用普通的JSON和CORS。

  

备选方案我可以检查调用IP,任何想法如何?

这将为您提供客户端的地址,而不是将客户端指向您的服务器。