不同服务器上的跨域ajax请求标头

时间:2014-03-12 10:36:38

标签: javascript ajax django http-headers xmlhttprequest

当我尝试向google.docs发送跨域请求时,它可以正常工作,但是当我尝试将其发送到另一个域上的服务器时,它会出错:

 XMLHttpRequest cannot load http://katrin.kit.edu/adei/services/getdata.php?db_server=orca&db_name=orca_process&db_group=Data_001_PAC_dat&db_mask=0,1,2,3,4,5,6,7&window=-1. No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://localhost:8000' is therefore not allowed access. 

但是当我尝试google.doc时,它返回正常的解析对象而没有任何错误。

我的要求:

 function ajax(url, callback, filetype, type) {
filetype = filetype ? filetype : 'json';
type = type ? type : 'GET';
var xhr = window.XMLHttpRequest ? new XMLHttpRequest() : new ActiveXObject('Microsoft.XMLHTTP');
var success = function(e) {
    var items = '';
    switch(filetype) {
        case 'csv': items = csv(xhr.responseText); break;
        case 'json': items = JSON.parse(xhr.responseText); break;
        default: items = xhr.responseText; break;
    }
    callback(items);
}
var error = function(e) { console.log('Please enabled CORS using  access-control-allow-origin'); }
if (window.XDomainRequest && !sameOrigin(url)) { xhr = new XDomainRequest(); xhr.onload = success; }
if (filetype == 'image' && xhr.overrideMimeType) { xhr.overrideMimeType('text/plain; charset=x-user-defined'); }
xhr.onerror = error;
xhr.onreadystatechange = function(e) { if (xhr.readyState == 4 && xhr.status == 200) { success(e); } }
try {
    if ('withCredentials' in xhr) { xhr.open(type, url, true); }
    else { xhr.open(type, url); }
    xhr.send(null);
}
catch(e) { error(e); }
}

// check if url is same domain

function sameOrigin(url){
   var split = url.split('/');
   if (split[0]+'//' == window.location.protocol+'//') { return split[2] != window.location.host ? false : true; }
   else { return true; }
}

// calculate length of object

function size(obj) {
  var size = 0, key;
  for (key in obj) {
    if (obj.hasOwnProperty(key)) size++;
  }
 return size;
}

我尝试更改标题,但仍存在问题:

以下是myserver网址的标头: myanotherserverurl

以下是google doc url的标题: enter image description here

其次我尝试设置myserver-localhost。添加了一些标题以响应:

def index(request):
data = {
    'title': getattr(settings, 'TITLE'),
    'description': getattr(settings, 'DESCRIPTION')
}
response = render_to_response('dimension/index.html', data, context_instance=RequestContext(request))

response['Access-Control-Allow-Origin'] = '*'  
response['Access-Control-Allow-Methods'] = 'POST, GET, OPTIONS'  
response['Access-Control-Max-Age'] = '1000'  
response['Access-Control-Allow-Headers'] = '*'  
return response  

但我认为问题与我的localhost服务器无关。

我尝试了jsonp库。它工作,但实际上只有json文件。但我需要不同的格式,如csv。

提前致谢!

1 个答案:

答案 0 :(得分:2)

要发出跨域请求,您请求的域应该授予您权限,并且该权限将作为对请求的响应以标头的形式发送回浏览器。如果浏览器发现您的名称不在允许的客户端列表中,浏览器将显示错误。因此,您无法在任何域提出请求。这是为了防止CSRF-跨站请求伪造。