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.

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.

 
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.