2013-12-16 62 views
0

我有一个现有的Java客户端上的IOS,andriod开发人员准备了一个简单的http请求为基础的应用程序。我试图在HTML5应用中实现相同的功能。发送朴素ajax HTTP请求与自定义标题

而现在我面临的困难是在AJAX请求中发送一个自定义标题,就像使用加密登录细节进行授权一样。

我试图在各种REST客户端上实现相同的功能,并能够在请求标头中发送“AUTHORIZATION:BASIC XXXXXX =”。并得到适当的JSON响应”

enter image description here

但是,如果我同样使用Ajax调用尝试我无法发送类似的请求头。请求发送作为选项,而不是GET和授权标签不正确会为标题代替它的将是“访问控制请求报头:授权”。

,这里是我曾尝试片断

<script> 
    //$.ajaxSetup({ headers: { 'Authorization': 'Basic XXXXXXX='} }) 


    // get form data for POSTING  
    var vFD = new FormData(document.getElementById('upload_form')); 
    var oXHR = new XMLHttpRequest(); 
    oXHR.open('POST', "https://123.123.123.123:229/"); 
    //oXHR.send(vFD); 



    var body = 'Basic XXXXXXX='; 
    var mUrl = "https://123.123.123.123:229/?json"; 
    var client = new XMLHttpRequest(); 
    client.open('GET', mUrl, true); 
    client.withCredentials = true; 
    client.crossDomain = true, 

    client.setRequestHeader('Authorization', 'Basic XXXXXXX='); 
    client.send(body); 



    simpleHttpRequest(); 
    function simpleHttpRequest() { 
     alert("calling "); 

     var headers = { 
      "Authorization": "Basic XXXXXXX=" 
     }; 
     $.ajaxSetup({ "headers": headers }); 
     $.ajaxSetup({ 'cache': false }); 
     $.ajax({ 
      type: "GET", 
      withCredentials: true, 
      //    data: { 
      //     address: 'http://www.google.com' 
      //    }, 
      crossDomain: true, 
      Headers: { "Authorization": "Basic XXXXXXX=" }, 
      dataType: "jsonp", 
      url: mUrl, 
      cache: false 
     }); 
    } 

    xhrToSend(); 
    function xhrToSend() { 
     // Attempt to creat the XHR2 object 
     var xhr; 
     try { 
      xhr = new XMLHttpRequest(); 
     } catch (e) { 
      try { 
       xhr = new XDomainRequest(); 
      } catch (e) { 
       try { 
        xhr = new ActiveXObject('Msxml2.XMLHTTP'); 
       } catch (e) { 
        try { 
         xhr = new ActiveXObject('Microsoft.XMLHTTP'); 
        } catch (e) { 
         statusField('\nYour browser is not' + 
        ' compatible with XHR2'); 
        } 
       } 
      } 
     } 
     xhr.withCredentials = true; 
     xhr.open('GET', mUrl, true); 
     xhr.setRequestHeader("Authorization", "numberOfBLObsSent"); 
     xhr.send(); 
    }; 
</script> 

及各种不同的方式得到失败,请帮我

在此先感谢。

回答

1

该问题与请求的跨域性质有关。当您提交包含自定义标题的跨域请求时,首先通过OPTIONS方法向服务器“预检”请求,服务器必须以标题Access-Control-Allow-Headers: your-custom-header响应。一旦收到,ajax客户端将会(自动)发出实际的请求。

More on preflighted requests

+0

感谢您的回复。我明白这是CORS的理由,但为什么它在我的REST,HTTP浏览器客户端和移动应用程序中工作。但不是在我的AJAX调用? –

+1

跨域策略不是HTTP的一部分,它是Web浏览器实现的一项功能,可提高安全性。因此,只有网页浏览器受制于跨域的规则。 – levi

+0

请参阅 - http://en.wikipedia.org/wiki/Same-origin_policy – levi