ugrás a tartalomhoz

Aszinkron lekérések más tartományból

Joó Ádám · 2010. Május. 26. (Sze), 23.09

A webnek az elmúlt néhány évben történő rohamos fejlődése, kétség sem férhet hozzá, nagyrészt az aszinkron lekérdezések (újra)felfedezésének köszönhető. Van azonban egy frusztráló korlátja ennek a technikának, melynek gyökerei egészen 1996-ig nyúlnak vissza: a same origin policy, mely nem engedi, hogy más tartományból, más protokollal vagy más porton keresztül érjünk el egy erőforrást. A megoldás azonban már ott található minden korszerű böngészőben.

A W3C tervezet neve Cross-Origin Resource Sharing (CORS), lényege pedig, hogy az ügyfél az idegen kiszolgáló felé speciális HTTP fejléccel azonosítja a kérő webhelyet, az pedig ugyanezen formában nyugtázza vagy tagadja meg a kérés teljesítését.

A Weblaborról indított egyszerű, text/plain típusú, szabványos fejléceket használó GET és POST üzenet esetén például a kérésben az Origin: http://weblabor.hu, míg a válaszban Access-Control-Allow-Origin: http://weblabor.hu szerepelhet. A * nyilvános erőforrást jelent. Ha a fejléc hiányzik, vagy az eredet nem egyezik, akkor a böngésző nem adja át a választ a szkriptnek.

Amennyiben más művelettel, típussal vagy nem szabványos fejléccel kívánunk kérést küldeni, úgy egy ún. preflighted (előreptetett?) OPTIONS keretében informálódhatunk a lehetőségekről:

Origin: http://weblabor.hu
Access-Control-Request-Method: PUT
Access-Control-Request-Headers: X-Bogre-Urtartalom

melyre a válasz valahogy így nézhet ki:

Access-Control-Allow-Origin: http://weblabor.hu
Access-Control-Allow-Methods: GET, POST, PUT, DELETE
Access-Control-Allow-Headers: X-Bogre-Urtartalom, X-Polo-Meret
Access-Control-Max-Age: 604800

A forgalmat csökkentendő az előreptetett kérés a megadott időtartamra gyorstárazható.

A feladathoz a böngészők a jól bevált XMLHttpRequest objektumot bővítik ki, míg az Internet Explorer 8 egy XDomainRequest nevűt vezet be, nagyjából ugyanazzal a felülettel.

  1. function CORSRequest() {  
  2.     if (typeof XDomainRequest != "undefined") {  
  3.         var request = new XDomainRequest();  
  4.     } else {  
  5.         var request = new XMLHttpRequest();  
  6.     }  
  7.       
  8.     this.responseText = request.responseText;  
  9.       
  10.     this.open  = request.open;  
  11.     this.send  = request.send;  
  12.     this.abort = request.abort;  
  13.   
  14.     request.onload  = this.onload;  
  15.     request.onerror = this.onerror;  
  16. }  

Amiben működik: Internet Explorer 8, Firefox 3.5, Chrome és Safari 4.

 
1

Like

janoszen · 2010. Május. 26. (Sze), 23.47
Nagyon ideje volna már kitenni azt a "Like" gombot. :)
2

Lájkolom

Thomas · 2010. Május. 27. (Cs), 16.11
Szintén :)
3

Origin elírás

Cowboy Coder · 2010. Május. 28. (P), 18.11
Origin: http://web.conf.hu

helyett
Origin: http://weblabor.hu
4

Tényleg

Joó Ádám · 2010. Május. 28. (P), 18.44
Javítottam, köszönöm.