Intervallo di tempo tra due richieste CORS utilizzando jquery ajax

Sto facendo richiesta CORS a un servizio web usando jQuery $.ajax . Come standard c’è una richiesta pre-volo e poi la richiesta POST effettiva.

Quello che ho notato è che ci sono due richieste ogni volta che provo a fare una chiamata al servizio web (una pre-volo e una richiesta POST effettiva) solo se c’è un intervallo di tempo tra le due richieste.

Se continuo a effettuare la chiamata al servizio web senza intervalli temporali (ad esempio meno di 1 secondo tra due richieste), manca il pre-volo.

Come posso evitare questa richiesta di pre-volo ogni volta?

Qual è questo intervallo di tempo?

È qualcosa di specifico per il browser Chrome?

Ci sono differenze tra i browser nel modo in cui implementano il caching pre-volo. Sfortunatamente la specifica W3C da sola non spiega le sfumature che hai osservato nella cache pre-volo.

Per gli altri che leggono questa domanda, vorrei spiegare quando l’OP dice che la richiesta di pre-volo si riferisce alla richiesta OPTIONS che precede una richiesta POST incrociata. La richiesta OPTIONS viene utilizzata per eseguire una query su un’API e determinare quali metodi HTTP sono consentiti per le richieste di origine incrociata. In genere, ti aspetteresti di vedere questo tipo di risposta a una richiesta OPTIONS :

 Access-Control-Allow-Origin: * Access-Control-Allow-Credentials: true Access-Control-Allow-Headers: Content-Type, X-Requested-With Access-Control-Allow-Methods: POST, GET, OPTIONS, DELETE, PUT 

Poiché stai lavorando con Google Chrome , ti rimanderò alla sezione applicabile del codice sorgente Webkit :

https://github.com/WebKit/webkit/blob/master/Source/WebCore/loader/CrossOriginPreflightResultCache.cpp

Il timeout della cache pre-volo predefinito è 5 secondi:

 static const auto defaultPreflightCacheTimeout = std::chrono::seconds(5); 

Il valore massimo è 5 minuti:

 static const auto maxPreflightCacheTimeout = std::chrono::seconds(600); 

Il server può specificare un valore di timeout per le richieste pre-volo utilizzando il campo Access-Control-Max-Age nell’intestazione della risposta, tuttavia il browser Webkit impone un timeout massimo di 5 minuti.

Per rispondere alle tue domande:

Come posso evitare questa richiesta di pre-volo ogni volta?

È necessario impostare Access-Control-Max-Age su 600 nell’intestazione della risposta API alla richiesta OPTIONS .

Qual è questo intervallo di tempo?

Per i browser Webkit (ad es. Google Chrome) il valore di timeout predefinito è 5 secondi . Questo è il motivo per cui visualizzi la richiesta pre-volo prima di ogni richiesta POST, ma se invii rapidamente le richieste POST, non visualizzerai ulteriori richieste pre-volo.

È qualcosa di specifico per il browser Chrome?

, ci sono differenze tra i browser nel modo in cui viene implementato il caching pre-volo. Le specifiche W3C non specificano tutto il necessario per creare funzionalità di memorizzazione nella cache pre-volo in un browser web.

Il browser non effettuerà una richiesta di verifica preliminare se le seguenti due situazioni sono vere:

  • Per il metodo di richiesta esiste una corrispondenza della cache del metodo oppure è un metodo semplice e il flag force preflight non è impostato.
  • Per ogni intestazione delle intestazioni delle richieste dell’autore esiste una corrispondenza della cache di intestazione per il nome del campo oppure è un’intestazione semplice.

Questo riferimento mostra le responsabilità dell’utente agente (browser) con CORS: http://www.w3.org/TR/cors/#cross-origin-request-with-preflight-0

Altrimenti, non dovresti preoccuparti per questo. L’implementazione del browser farà la cosa giusta.