Bu makale makine çevirisi ayna makalesidir, orijinal makaleye geçmek için lütfen buraya tıklayın.

Görünüm: 12584|Yanıt: 0

[Jırlama] JSONP - Ajax'ta alanlar arası erişim sorununu çözmek

[Bağlantıyı kopyala]
Yayınlandı 28.12.2015 14:22:00 | | |

Uzun zamandır deneme yazmadım ve hep zamanım yokmuş gibi hissediyorum ama aslında zaman... Yeterince saçmalık, birkaç gün önce iş başında yeni bir gereklilik vardı; ön uç web sayfasının bilgileri geri göndermek için arka uç Web servisi yöntemini asenkron olarak çağırmasını gerektiriyordu. Bunu uygulamanın birçok yolu var, bu örnek jQuery+Ajax kullanıyor, tamamlandıktan sonra yerel olarak hata ayıklaması normal, ancak sunucuya dağıttıktan sonra bir sorun var ve arka plan servis çağrısı yanıt vermiyor, ne oluyor? Kod çok değişmedi, değişen tek şey jQuery'nin ajax yöntemindeki URL adresi. Buradaki sorun, kontrol ve hata ayıklama yaptıktan sonra, homolog politikanın hatalı olduğu ortaya çıkması olabilir mi, Javascrip{filtering}t veya jQuery'nin web ön uçu geliştirmede sıkça kullanılan dinamik bir betik tekniği olduğunu biliyoruz. Javascrip{filtering}t'de "Aynı Köken Politikası" olarak bilinen önemli bir güvenlik sınırlaması vardır. Bu politika, Javascrip{filter}t kodunun erişebileceği sayfanın içeriğine önemli bir kısıtlama getirir; yani Javascrip{filtering}t, yalnızca içeriği içeren belge veya betikle aynı alan adı altında erişebilir. Farklı alan adları altındaki betikler birbirine erişemez, alt alanlar bile bile. Eşanlamlı strateji hakkında okuyucular Baidu'da daha ayrıntılı açıklayabilir, bu burada tekrar edilmeyecektir.



Ama bazen alanlar arası işlemler yapmak kaçınılmazdır ve "homolog politika" bir sınırlamadır, ne yapmalıyız? JSONP çapraz alanların nasıl uygulandığına bir göz atalım ve JSONP çapraz alan ilkesini tartışalım.



Burada JSONP'den bahsediliyor, sonra biri sordu, JSON ile arasındaki fark nedir, bakalım, Baidu Ansiklopedisi'nde şu açıklama var:

JSON (Javascrip{filtering}t Object Notation), hafif bir veri alışverişi formatıdır. Javascrip{filter}t'nin bir alt kümesine dayanır (Standard ECMA-262 3. Baskı - Aralık 1999). JSON tamamen dil bağımsız bir metin formatı kullanır, ancak aynı zamanda C ailesine benzer alışkanlıklar da kullanır (C, C++, C#, Java, Javascrip, Perl, Python vb. dahil). Bu özellikler, JSON'u veri alışverişi için ideal bir dil haline getirir. İnsanlar tarafından kolayca okunup yazılabilir, ama makine tarafından ayrıştırılması ve üretilmesi de kolaydır (hızlı ağ iletimi).

JSONP (doldurma ile JSON), JSON'un bir "kullanım modeli"dir ve ana akım tarayıcılarda alanlar arası veri erişimi sorununu çözmek için kullanılabilir. Aynı kaynak politikası nedeniyle, genellikle server1.example.com üzerinde bulunan sayfalar, server1.example.com olmayan sunucularla iletişim kuramaz; HTML'nin <scrip{filter}t> öğesi hariç. <scrip{filter}t> öğesinin bu açık stratejisiyle, web sayfaları JSON verilerini dinamik olarak diğer kaynaklardan elde edebilir ve bu kullanım modeli JSONP olarak bilinir. JSONP ile yakalanan veri JSON değil, JSON ayrıştırıcı tarafından ayrıştırılmak yerine Javascrip{filter}t çeviricisi ile çalıştırılan rastgele Javascrip{filter}t'dir.



Bu noktada, JSON'un, xml gibi hafif bir veri alışverişi formatı olduğu ve veri arasındaki verileri tanımlamak için kullanıldığı anlaşılmalıdır. JSONP, JSON verilerini kullanmanın bir yoludur ve JSON nesnesi döndürmek yerine, JSON nesnesi içeren bir javascrip{filtering}t betikidir.



Peki JSONP nasıl çalışıyor, aynı kaynak politikasının sınırlamaları nedeniyle XmlHttpRequest'in yalnızca mevcut kaynaktan (alan adı, protokol, port) kaynak taleplerine izin verdiğini biliyoruz. Güvenlik nedeniyle alanlar arası istekler mümkün değildir, ancak web sayfalarında js dosyaları çağrıldığında, bunların alanlar arası etkilerden etkilenmediğini ve "src" özniteliğine sahip etiketlerin <scrip{filter}t>, <img>, ,<iframe>Alanlar arası bir talep yapmak istiyorsanız, html'nin scrip{filter}t etiketini kullanarak alanlar arası bir talep yapın ve yanıtta çalıştırılacak scrip{filtering}t kodunu döndürün; bu kodda JSON kullanarak javascrip{filter}t nesnesini doğrudan geçirebilirsiniz. Yani, çapraz alan sunucusunda JSON verisi üretip ardından bunu scrip{filtering}t betiklerine sarmak, aynı kaynak politikasının sınırlamalarını aşır ve alanlararası erişim sorununu çözer.

Bunu nasıl başaracağımıza bir göz atalım:

Ön uç kodu:






Önceki:Winform formları arasındaki delege değerleri
Önümüzdeki:Aynı Windows makinesinde birden fazla Memcached servisi başlatın
Feragatname:
Code Farmer Network tarafından yayımlanan tüm yazılım, programlama materyalleri veya makaleler yalnızca öğrenme ve araştırma amaçları içindir; Yukarıdaki içerik ticari veya yasa dışı amaçlarla kullanılamaz, aksi takdirde kullanıcılar tüm sonuçları ödemelidir. Bu sitedeki bilgiler internetten alınmakta olup, telif hakkı anlaşmazlıklarının bu siteyle hiçbir ilgisi yoktur. Yukarıdaki içeriği indirmeden sonraki 24 saat içinde bilgisayarınızdan tamamen silmelisiniz. Programı beğendiyseniz, lütfen orijinal yazılımı destekleyin, kayıt satın alın ve daha iyi orijinal hizmetler alın. Herhangi bir ihlal olursa, lütfen bizimle e-posta yoluyla iletişime geçin.

Mail To:help@itsvse.com