2013-01-04 11 views
7

Ho fatto qualche ricerca su internet, ma non sono riuscito a ottenere il quadro completo su questo argomento. Qualcuno può aiutare a risolvere questa risposta per ora e per sempre?Posso impostare le intestazioni nelle richieste json tra domini diversi?

Questo è quello che ho trovato finora:

  • E 'possibile fare chiamate dominio croce con jsonp. La modifica delle intestazioni nella chiamata jsonp non è mai consentita
  • È possibile effettuare chiamate interdominio con json se il server lo consente.

questo è quello che sto cercando di fare:

$.ajax({ 
    type: "GET", 
    crossDomain: true, 
    beforeSend: function (request) { 
     request.setRequestHeader("Authorization", "Bearer " + ($("#accesstoken").val())); 
    }, 
    contentType: "application/json; charset=utf-8", 
    url: myJSonServer + encodeURI(operation), 
    dataType: 'json', 
    cache: false, 
    success: callback, 
    error: function (jqXhr, textStatus, errorThrown) { alert(textStatus + ": " + errorThrown); } 
}); 

Questo è ciò che sta accadendo:

  • Quando il myJSonServer è sullo stesso dominio, non v'è alcun problema a tutti
  • Quando myJSonServer si trova su un altro dominio, la richiesta viene inviata, ma senza l'intestazione Bearer

Questa intestazione Bearer fa parte dello standard oAuth2.

Sono consapevole del fatto che forse questa non è la soluzione migliore, impostando accessToken nel Browser. E so che potrei usare un proxy per questa situazione.

Sono curioso di sapere se è o sarà possibile impostare le intestazioni su una richiesta json tra domini diversi?
Grazie

- problema risolto

stavo usando MVC4 e ha aggiunto crossDomainScriptAccessEnabled = "true" nel web.config. Pensavo che sarebbe bastato, ma la risposta di apsillers ha risolto il mio problema. Ora ho aggiunto questo nel mio web.config:

<system.webServer> 
    <httpProtocol> 
     <customHeaders> 
     <add name="Access-Control-Allow-Origin" value="*" /> 
     <add name="Access-Control-Allow-Headers" value="Authorization" /> 
     </customHeaders> 
     </httpProtocol> 
    </system.webServer> 
+0

Possibile duplicato dell'intestazione di "autorizzazione" incrociata con jquery.ajax()] (http://stackoverflow.com/questions/9559947/cross-origin-authorization-header-with-jquery-ajax). – apsillers

risposta

10

Con JSONP, non è possibile impostare le intestazioni personalizzate.

Con CORS, il server deve inviare l'intestazione Access-Control-Allow-Headers per consentire intestazioni di richieste non comuni dal client. Da HTML5 Rocks CORS page:

Access-Control-Allow-Headers ... - Elenco delimitato da virgole delle intestazioni di richieste supportate.

Così, il server deve inviare una Access-Control-Allow-Headers: Authorization per lasciare il browser sa è lecito inviare Authorization al server con la richiesta.Senza questa intestazione di sever, il browser invierà solo alcune intestazioni comuni con la richiesta e ignorerà il resto.

1

Dal momento che "jsonp" funziona creando un tag script e utilizzando l'attributo src= per caricare risorse da un altro dominio. Quindi non penso che ci sia un modo per modificare le intestazioni delle richieste.

0

Se si utilizza JSONP per effettuare una richiesta di origine incrociata, la risposta è no, non è possibile impostare le intestazioni HTTP su tali richieste. Se si utilizza CORS per effettuare richieste di origine incrociata, la risposta è sì, poiché si utilizza XHR normale per effettuare la richiesta: http://en.wikipedia.org/wiki/Cross-origin_resource_sharing.

Problemi correlati