четверг, 16 февраля 2012 г.

Cross-Origin Resource Sharing

Протокол который позволяет использовать оригинальный XMLHttpRequest обьект для крос-доменных запросов(XDR).
Суть его в том, что предварительно браузер в котором находится страница с одного сервера, и ее скрипты будут пытаться делать кросс-доменные запросы на другой сервер, должен предварительно договориться о подобном с этим другим сервером. Он предварительно спрашивает разрешения может ли скрипт с такого-то домена к нему обратиться.


Это можно сделать либо обычным запросом GET или POST, в котором будет заголовок
Origin: http://sample.dom
А в ответ получит:
Access-Control-Allow-Origin: http://sample.dom
И только в этом случае XMLHttpRequest обьектам, пытающимся делать запросы на этот другой сервер будет пердоставлена такая возможность браузером.

Либо, что более предпочтительно, браузер сам делает запрос методом OPTIONS (как GET, POST ...) с необходимыми заголовками, и в зависимости от ответа сервера, разрешает делать запрос или нет.

Пример кроссбраузерного кода для создания обьекта XMLHttpRequest кля XDR запросов:

function createCORSRequest(method, url){
    var xhr = new XMLHttpRequest();
    if ("withCredentials" in xhr){//так предложили Mozilla проверять поддержку
        xhr.open(method, url, true);
    } else if (typeof XDomainRequest != "undefined"){//для ie8
        xhr = new XDomainRequest();
        xhr.open(method, url);
    } else {// ой, браузер не поддерживает родные XDR-запросы
        xhr = null;
    }
    return xhr;
}

var request = createCORSRequest("get", "http://www.nczonline.net/");
if (request){
    request.onload = function(){
        //do something with request.responseText
    };
    request.send();
}
И так, что мы имеем? На этапе open, а может быть непосредственно по методу send, браузер предварительно делает запрос OPTIONS, и по результатам ответа делает запрос или нет. Эта технология (протокол) с предварительным запросом называется Preflighted requests(предполетные запаросы)

Вот такие возможны заголовки в предполетном запросе:
Origin: http://sample.dom
Access-Control-Request-Method: POST
Access-Control-Request-Headers: CustomHeader1, CustomHeader2
А вот возможный успешный ответ:
Access-Control-Allow-Origin: http://sample.dom
Access-Control-Allow-Methods: POST, GET
Access-Control-Allow-Headers: CustomHeader1, CustomHeader2
Access-Control-Max-Age: 1728000

Credentialed requests

По-умолчанию в CORS ни запросы, ни ответы не предоставляют Credentials (куки, HTTP authentication, and client-side SSL certificates). Чтобы это сделать, обьекту XMLHttpRequest нужно поставить тру в свойство:
xhr.withCredentials = true;

Серверу в таком случаем отправится заголовок:
Access-Control-Allow-Credentials: true
Если сервер ответит тем же заголовком со значением тру, то кретеншиалс начинают предоставляться.

Проблема в том, что в ie8 обьект XDomainRequest такой возможности не предоставляет.

Комментариев нет:

Отправить комментарий