2012-12-21 7 views
20

Sto tentando di inviare una richiesta CORS per un payload JSON. Controllo sia il server che il client.Come si invia un'intestazione personalizzata in un XML-HTTPRequest su più domini (CORS)?

Sto seguendo lungo qui: https://developer.mozilla.org/en-US/docs/HTTP/Access_control_CORS?redirectlocale=en-US&redirectslug=HTTP_access_control

Il server ha un header personalizzato che deve essere inviato insieme ad ogni richiesta. Questa intestazione personalizzata rende quindi la richiesta "non semplice" e pertanto la richiesta deve essere sottoposta a preflight con una richiesta OPTIONS.

Posso vedere jquery effettuare la richiesta OPZIONI, ma non invia l'intestazione personalizzata lungo.

metodi che ho provato:

In entrambi i casi, il browser non sta inviando l'intestazione personalizzata insieme .

Sto usando FF 17.0.1, jquery 1.8.3.

+0

Mostra il codice in cui stai cercando di impostare l'intestazione. – Barmar

+0

L'opzione opzione 'intestazioni: {Intestazione: valore}' non funziona? – Barmar

+0

Qual è il nome dell'intestazione che causa problemi? Sono d'accordo con Barmar, mostrando tutto il tuo codice JS e la richiesta/risposta può aiutare a eseguire il debug di questo. – monsur

risposta

30

Il tuo problema non è con jquery, è in how CORS works. Probabilmente il tuo callback beforeSend funzionava come previsto ... ma i browser non invieranno intestazioni personalizzate nelle richieste di preflight, a prescindere da cosa. Questo è di design; lo scopo della richiesta di verifica preliminare è determinare quali informazioni l'utenteagente (browser) può inviare oltre la "semplice" roba definita nella specifica CORS. Pertanto, l'utente che invia dati non semplici (come l'intestazione personalizzata) come parte della richiesta di verifica preliminare è controproducente.

Per richiedere all'utente di includere l'intestazione personalizzata nella richiesta CORS effettiva, includere Access-Control-Allow-Headers header nella risposta di preflight. Vale la pena notare che se non si è eccessivamente preoccupati di quali intestazioni l'useragent trasmette, credo che si possa semplicemente riportare il valore del campo di intestazione della richiesta Access-Control-Request-Headers come valore dello Access-Control-Allow-Headers inviato nella risposta.

Si potrebbe anche voler includere alcune delle altre intestazioni Access-Control-Allow-* definite nel syntax section of the spec.

Vedi anche CORS - How do 'preflight' an httprequest?

Vedi anche Mozilla's CORS preflight example, che mostra queste intestazioni in azione.

+1

Grazie. Ho cose che funzionano dopo che la risposta di preflight è avvenuta, è solo la chiamata OPTIONS che è il problema. Sembra che dovrò utilizzare una soluzione alternativa basata sul server. – mooreds

+0

@mooreds: puoi fornire un'istantanea delle intestazioni inviate/ricevute nella richiesta di preflight? Il problema è che il tuo server rifiuta la richiesta OPTIONS perché non ha l'intestazione personalizzata? 'Suppongo che non capisco perché è necessario il problema del server ancora se le cose funzionano dopo la risposta preflight. – broofa

+0

sì, la richiesta OPTIONS è stata rifiutata perché non ha l'intestazione personalizzata.Su Chrome, il resto dei dati è stato ancora inviato (che potrebbe essere stato perché sto sviluppando su localhost, non sono sicuro), ma per Firefox, una volta che la richiesta OPTIONS ha avuto esito negativo, il resto della richiesta ha esito negativo. – mooreds

Problemi correlati