Erişim Denetimi İstek Üstbilgileri, jQuery ile AJAX isteğinde üstbilgiye eklenir


404

JQuery AJAX POST isteğine özel bir başlık eklemek istiyorum.

Bunu denedim:

$.ajax({
    type: 'POST',
    url: url,
    headers: {
        "My-First-Header":"first value",
        "My-Second-Header":"second value"
    }
    //OR
    //beforeSend: function(xhr) { 
    //  xhr.setRequestHeader("My-First-Header", "first value"); 
    //  xhr.setRequestHeader("My-Second-Header", "second value"); 
    //}
}).done(function(data) { 
    alert(data);
});

Bu isteği gönderdiğimde ve FireBug ile izlediğimde şu başlığı görüyorum:

SEÇENEKLER xxxx / yyyy HTTP / 1.1
Ana Bilgisayar: 127.0.0.1:6666
Kullanıcı Aracısı: Mozilla / 5.0 (Windows NT 6.1; WOW64; rv: 11.0) Gecko / 20100101 Firefox / 11.0
Kabul: metin / html, uygulama / xhtml + xml, application / xml; q = 0.9, / ; q = 0.8
Kabul Dili: fr, fr-fr; q = 0.8, en-us; q = 0.5, en; q = 0.3
Kabul Et-Kodlama: gzip, deflate
Bağlantı: tutmak -alive
Menşei: null
Erişim-Denetim-İstek-Yöntem: POST
Erişim-Denetim-İstek-Üstbilgiler: benim ilk başlığım, ikinci başlığım
Pragma: no-cache
Cache-Control: no-cache

Benim özel başlıklar Neden gidiyorsun Access-Control-Request-Headers:

Erişim-Denetim-İstek-Başlıkları: ilk başlığım, ikinci başlığım

Ben böyle bir başlık değerleri bekliyordum:

Birinci Başlığım: ilk değer
İkinci Başlığım: ikinci değer

Mümkün mü?



Sorunun başlığı "Diğer Etki Alanı İçin"
Muhasebeci م

Yanıtlar:


138

Firefox'ta gördükleriniz gerçek istek değildi; HTTP yönteminin POST değil OPTIONS olduğunu unutmayın. Aslında, tarayıcının bir etki alanları arası AJAX isteğine izin verilip verilmeyeceğini belirlemek için yaptığı 'uçuş öncesi' isteğiydi:

http://www.w3.org/TR/cors/

Uçuş öncesi isteğindeki Access-Control-Request-Headers üstbilgisi, gerçek istekteki üstbilgilerin listesini içerir. Daha sonra sunucunun, tarayıcı gerçek isteği göndermeden önce bu başlıkların bu bağlamda desteklenip desteklenmediğini raporlaması beklenir.


438

Aşağıda, bir jQuery Ajax çağrısında istek üstbilgisinin nasıl ayarlanacağı örneği verilmektedir:

$.ajax({
  type: "POST",
  beforeSend: function(request) {
    request.setRequestHeader("Authority", authorizationToken);
  },
  url: "entities",
  data: "json=" + escape(JSON.stringify(createRequestObject)),
  processData: false,
  success: function(msg) {
    $("#results").append("The result =" + StringifyPretty(msg));
  }
});

10
thx, biliyorum özel başlık ile Ajax istek göndermek. Benim sorunum farklı alan adı ile .. Tüm özel başlıkları Erişim-Kontrol-İstek-Başlıklar koymak. sadece tarayıcıda güvenlik: web alanları arası.
fingerup

evet, tarayıcılar arası etki alanı istekleri bazı zorluklara neden olabilir. etki alanları arası isteklerinizi göndermek için her zaman bazı proxy komut dosyaları kullanabilirsiniz
milkovsky

API KEY ile başlıkları nasıl eklerim?
Si8

@ Si8 lütfen bu yazıyı kontrol edin stackoverflow.com/questions/5517281/…
milkovsky

178

Aşağıdaki kod benim için çalışıyor. Her zaman sadece tek tırnak kullanıyorum ve iyi çalışıyor. Ben sadece tek tırnak veya sadece çift tırnak kullanmanızı öneririz , ancak karışık değil.

$.ajax({
    url: 'YourRestEndPoint',
    headers: {
        'Authorization':'Basic xxxxxxxxxxxxx',
        'X-CSRF-TOKEN':'xxxxxxxxxxxxxxxxxxxx',
        'Content-Type':'application/json'
    },
    method: 'POST',
    dataType: 'json',
    data: YourData,
    success: function(data){
      console.log('succes: '+data);
    }
  });

1
thx, biliyorum özel başlık ile Ajax istek göndermek. Benim sorunum farklı alan adı ile .. Tüm özel başlıkları Erişim-Kontrol-İstek-Başlıklar koymak. sadece tarayıcıda güvenlik: web alanları arası.
fingerup

Teşekkürler, yanlışlıkla "Yetkilendirme: Temel XXXXXX" başlıklarını ayarlamıştım ve iOS 9 / Safari 9 bir projeye SyntaxError DOM 12'yi atıyordu.
Mark

4
Çift veya tek tırnak mı demek istediniz? Kimsenin çift parantez kullanacağını sanmıyorum.
DBS

3
Çift veya tek tırnak ("parantez" değil) burada yapacak bir şey yok.
Pere

5.6 ve üstü için X-CSRF-TOKEN
Abdul Rahman A Samad

12

CORS isteğiniz basit bir istek olmayacak şekilde özel üstbilgiler gönderdiğiniz için, tarayıcı ilk olarak sunucunun isteğinize izin verip vermediğini kontrol etmek için bir ön kontrol OPTIONS isteği gönderir.

Resim açıklamasını buraya girin

Sunucuda CORS'yi açarsanız kodunuz çalışır. Bunun yerine JavaScript getirmeyi de kullanabilirsiniz ( burada )

İşte nginx (nginx.conf dosyası) üzerinde CORS'yi açan bir örnek yapılandırma :

Apache'de (.htaccess dosyası) CORS'yi açan örnek bir yapılandırma


3

Bu nedenle JavaScript ile bir bot oluşturamazsınız, çünkü seçenekleriniz tarayıcının yapmanıza izin verdiği şeyle sınırlıdır. Çoğu kökenin izlediği CORS politikasını izleyen bir tarayıcıyı, diğer kökenlere rastgele istekler göndermek ve basitçe yanıt almanızı sağlamak için sipariş edemezsiniz !

Ayrıca, origin-headertarayıcılarla birlikte gelen geliştiriciler araçlarında olduğu gibi bazı istek başlıklarını el ile düzenlemeye çalıştıysanız , tarayıcı düzenlemenizi reddeder ve ön kontrol OPTIONSisteği gönderebilir .


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.