AJAX Mustafa Ahmet KARA
Same Origin Policy, Netscape Navigator 2.0 zamanında yayınlanmış ve o zamandan beri tüm browserların kabul ettiği bir politikadır. Temel olarak farklı bir kaynaktan yüklenen bir doküman veya script 'in yüklendiği dokümanın özelliklerini değiştirmesini engeller. Bu bağlamda kaynak olarak kastedilen, yüklenen dokümanın bulunduğu alan adını,port'unu ve protokolünün birleşmesidir. Bu şekilde bakıldığında sayfamıza Google Maps uygulaması eklemek istediğimizde haritanın çalışmaması gerekirdi, ama sağlıklı bir şekilde çalışabiliyor. Dolayısıyla bu şekilde bir ihtiyacı bizim nasıl karşılayabileceğimizi bu dokümanda inceleyeceğiz.
Same Origin Policy temel olarak bir kaynaktan yüklenen script veya dokümanların diğer kaynaktan yüklenen dökümanların özelliklerini değiştirmesini engeller. Bu duruma http://store.company.com/dir/page.html sayfası için örnek vermek gerekirse ( Mozilla Kaynak Dokümanı):
|
Asıl bizim için önemli olan soruya gelirsek, bu bizi nasıl etkiler? Örnek vermek gerekirse XMLHttpRequest ile uygulamanızın yüklü olduğu domain haricinde herhangi bir adresten bir kaynak indirmek istediğinizde etkileyecektir. Çünkü tarayıcınız buna izin vermeyecektir(Bu durum yerel dosyalar tüm yetkilere sahip olduğu için geçerli değildir.). Bu durumu görmek için aşağıdaki linki tıklayınız. Link kodu ise aşağıdaki gibidir.
Hatayı görmek için tıklayınız
-
try{
-
var xmlHttp = (window.XMLHttpRequest)?new XMLHttpRequest() : new ActiveXObject("Msxml2.XMLHTTP");
-
xmlHttp.open("GET","http://www.yahoo.com",false);
-
}catch(err){
-
alert(err.toString());
-
}
Bu örneğin tam anlamı ise ajax-tr.com alan adında bulunan bir doküman veya javascript, yahoodan herhangi bir sayfa veya veri alamaz demektir.
Bu durumla ben dış sitelere hizmet verecek bir AJAX uygulaması yazarken karşılaşmıştım. Uygulama bir script tagı ile benim alan adımdaki bir javascript dosyasını yüklüyor ve benim uygulamamdan veri alıyordu. Fakat her bir çağrıda "Permission Denied" veya "Error: uncaught exception: Permission denied to call method XMLHttpRequest.open" hataları ile karşılaştım ve sorunum çözülmedi. Google, Yahoo gibi çeşitli AJAX uygulamaları sunucularının bu sorunu çözmeleri ise açıkçası benim için oldukça şaşırtıcı olmuştu. Sorunumuzu anladıktan sonra bu aşamada çözümlerini inceleyeceğiz ve XMLHttpRequest'in AJAX için bir zorunluluk olmadığını göreceğiz.
Çözümlerden en kolay olanı tarayıcı ayarlarınızda Trusted Sites listesine bu farklı domain'i eklemenizdir. Ama bu çözüm tüm uygulamalarınızı kullanan tüm domain'lerin kullanıcılarına kendi sitenizi ekletmek demektir ki bu ne yazık ki yerel veya wan üzerinde çalışan uygulamalarda mümkün olabilmektedir. Internete çıktığınızda çözüm olmaktan bile çıkmaktadır.
Mozilla tarafında alt alan adları için document.domain javascript nesnesini ayarlayarak bu engeli aşabilirsiniz ama diğer tarayıcılarda bu geçerli olmayacaktır.
Diğer bir çözüm ise arada bir Flash proxy kullanmaktır. Flash benzer olarak tüm çağrılar üzerinde same-origin policy'ye sahiptir ama hedef sitede crossdomain.xml dosyası bulunursa bu policy aşılabilmektedir. Eğer Flash bu dosyayı bu domain üzerinde bulur ve istekte bulunan domain bu listede var ise bu çağrıya izin vermektedir. Dolayısıyla bu güzel bir çözüm olabilir fakat flash player yüklü olmayan makinelerde bu bir sorun olacaktır. Ayrıca kişisel olarak javascript ile yapılabiliyorsa javascript ile yapma tercihini prensip edindiğimden dolayı flash pek tercih ettiğim bir çözüm değildir. Aktivasyon ve güncelleme problemlerinide unutmamak gerekir.
Başka bir çözüm ise bizim uygulamamızı içinde barındıracak uygulamaya sunucu tarafında bir proxy yazmak olacaktır. Bu ise tüm programlama dillerinde çözüm üretmek anlamına gelecektir ayrıca bizim uygulamamızı kullanacak olan diğer sitelerin kodlarına müdahale etmemiz gerekecektir. Script'imiz yüklendikten sonra içinde bulunduğu sitede bizim tarafımızdan yazılan proxy üzerinden çağrıları yapacaktır ve o proxy bizim sitemize bağlanacaktır. Sonuçlarda aynı şekilde geri dönecektir. Bu da bir çözüm olabilir fakat çağrıları bir aracı kurumdan aldığımızdan dolayı işlem süreleri uzamaktadır. Ayrıca çoğu zaman bizim uygulamamızı kullanacak sistemlere müdahale edemeyiz. Google veya Yahoo bu işlemi yapmamaktadır.
Şu ana kadar pek iyi yollarla çözülebilen işlemleri bir sonraki sayfada daha güzel yöntemlerle geliştireceğiz. img, css, iframe ve script etiketleri ile çözümlerimizi bir sonraki sayfada görebilirsiniz.
Sayfalar: 1 2
Toplamda 3566 kez okunmuş.
Şu an 1 kişi okuyor.
En fazla 6 kişi aynı anda okumuş.
Bugün 16 kez okunmuş.
Etiketler: ajax, asenkron, css, javascript, json, same origin policy
Trackback Yorumları takip et Baskı Önizleme

(12 oy, ortalama 4.08)
# selim | 10 Ekim 2007, 15:58
tam ihtiyacım olan şeyi çok güzel ve ayrıntılı yazmışsınız. birkaç kere bu konuda takılmıştım (iframe in içeriğini almayı bilmiyordum [bilsem de bu aklıma gelmezdi heralde:) ]) çok işime yarıyacak.
şimdi kodumu yazmaya başlıyorum.
teşekkürler.
iyi çalışmalar
# ilhank | 03 Aralık 2007, 10:55
İstifade ettim, faydalı bir yazı olmuş. Tebrikler.
# Eralp | 24 Aralık 2007, 13:21
abicim , ellerine sağlık.
Mükemmel!
bende server side proxy üzerinden hallediyordum ama dediğin gibi request timeout oldukca olasıydi..
JSON+iframe.. en etkili cozum..
# Rnyk Mnyk | 27 Şubat 2008, 08:03
Anlatımınız harika, ayrıca yaklaşık bir hafta kadar aradığım ama ukalalık edip sadece yabancı sitelerde arayıp bulamadığım dop dolu bir içeriği hazırlamışsınız. Teşekkür ve Tebrik ediyorum. Bilginiz ve sabrınız için.