我正在尝试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,任何想法如何?
非常感谢
答案 0 :(得分:0)
为什么这样有效?这不是一个跨域调用,因此我需要实现ALLOW-ORIGIN标头的东西吗?我
就浏览器而言,您不是直接从不同的来源读取数据。您正在从另一个来源加载JavaScript程序(它碰巧捆绑了一些数据)。
在服务器中,我无法确定哪个域正在进行调用,req.headers.origin始终未定义。我希望能够知道哪个域名正在呼叫,以防止不必要的呼叫。
引用页面的URL存储在Referer标头中,而不是Origin标头中。但是,它是可选的,在许多情况下不会发送。
如果要限制对某些站点的数据访问,则不能使用JSON-P。请改用普通的JSON和CORS。
备选方案我可以检查调用IP,任何想法如何?
这将为您提供客户端的地址,而不是将客户端指向您的服务器。