Aszinkron lekérések más tartományból
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.
function CORSRequest() {
if (typeof XDomainRequest != "undefined") {
var request = new XDomainRequest();
} else {
var request = new XMLHttpRequest();
}
this.responseText = request.responseText;
this.open = request.open;
this.send = request.send;
this.abort = request.abort;
request.onload = this.onload;
request.onerror = this.onerror;
}
Amiben működik: Internet Explorer 8, Firefox 3.5, Chrome és Safari 4.
■
Like
Lájkolom
Origin elírás
helyett
Origin: http://weblabor.hu
Tényleg