Żądania XMLHttpRequest przesyłane między witrynami

Uwaga dotycząca Firefoksa 3

Ta funkcja jest obsługiwana w programie Firefox 3, lecz jest dostępna wyłącznie w rozszerzeniach i z poziomu innego kodu uprzywilejowanego; obecnie nie można z niej korzystać na poziomie stron WWW.

Program Firefox 3 jest zgodny z roboczą wersją specyfikacji W3C Access Control (Kontrola dostępu), która umożliwia przesyłanie żądań XMLHttpRequest między witrynami w różnych domenach (ang. cross-site ).

Omówienie

Mechanizmy kontroli dostępu pozwalają na uzyskanie większej kontroli nad dokumentami publikowanymi w sieci WWW dzięki możliwości określenia witryn, z których można uzyskać dostęp do tych dokumentów za pomocą żądania wysyłanego przez przeglądarkę (takiego jak XMLHttpRequest).

Ponadto ten schemat kontroli dostępu umożliwia wysyłanie przez aplikacje internetowe żądań skierowanych do witryn zewnętrznych. Teoretycznie możliwe jest zatem przesłanie żądania dokumentu z witryny google.com za pomocą obiektu XMLHttpRequest, działającego na stronie z witryny twojastrona.pl (warunkiem jest zastosowanie omówionych poniżej mechanizmów kontroli dostępu). Twórcy witryn internetowych dysponują w ten sposób większą elastycznością w zakresie oferowania możliwości budowy serwisów „mashup” czy też aplikacji korzystających z własnych danych użytkowników.

Zastosowanie

W programie Firefox 3 istnieją dwie metody korzystania z mechanizmów kontroli dostępu. Pierwszą z nich jest nowy nagłówek HTTP Access-Control (stosowany do wszystkich typów zasobów; konieczny jest dość wysoki poziom kontroli nad serwerem WWW), natomiast druga to instrukcje przetwarzania dotyczące kontroli dostępu (mające zastosowanie jedynie w przypadku dokumentów XML).

Nagłówki Access-Control

Nagłówki są najbardziej elastycznym sposobem zezwalania na żądania XMLHttpRequest przesyłane przez witryny zewnętrzne. Jak pokazano w poniższym przykładzie, po ustawieniu dodatkowych nagłówków Access-Control wysyłanych przez serwer w odpowiedzi na żądania dostęp do żądanych danych będzie mogła uzyskać dowolna aplikacji z domeny mozilla.org.

 Access-Control: allow <mozilla.org>

Nagłówek Access-Control umożliwia zezwolenie na dostęp do zasobu lub zabronienie dostępu na podstawie źródła żądania i metody, jakiej użyto do jego przesłania.

Poniższy kod zawiera przykłady prawidłowych nagłówków Access-Control:

 // Dostęp do zasobu mogą uzyskać wszyscy, bez ograniczeń
 Access-Control: allow <*>

 // Dostęp do zasobu jest zabroniony dla wszystkich, bez wyjątków
 Access-Control: deny <*>

 // Dostęp do zasobu można uzyskać wyłącznie z domeny 'mozilla.org'
 // (włącznie z poddomenami)
 Access-Control: allow <mozilla.org>

 // Dostęp do zasobu można uzyskać ze wszystkich poddomen domeny 'mozilla.org'
 // z wyjątkiem poddomeny developer.mozilla.org
 Access-Control: allow <mozilla.org> exclude <developer.mozilla.org>

 // Dostęp do zasobu można uzyskać wyłącznie z określonej domeny oraz przy użyciu
 // określonego portu i określonej metody
 Access-Control: allow <developer.mozilla.org:80> method GET, POST

Więcej przykładowych poleceń można znaleźć w roboczej wersji specyfikacji W3C Access Control.

Przykład

W tym prostym przykładzie zewnętrzna witryna WWW wysyła żądanie pliku HTML. Plik ten jest generowany przez skrypt PHP, wysyłający dodatkowy nagłówek Access-Control. Po skopiowaniu pliku header.html na własny serwer zauważysz, że żądanie jest nadal obsługiwane poprawnie — zezwolenie na jego wysłanie zostało bowiem udzielone wszystkim witrynom.

header.html

 <html>
 <head>
 <script>
 window.onload = function(){
   var xhr = new XMLHttpRequest();
   xhr.open("GET", "http://dev.jquery.com/~john/xdomain/test.php", true);
   xhr.onreadystatechange = function(){
     if ( xhr.readyState == 4 ) {
       if ( xhr.status == 200 ) {
         document.body.innerHTML = "Nazywam się: " + xhr.responseText;
       } else {
         document.body.innerHTML = "BŁĄD";
       }
     }
   };
   xhr.send(null);
 };
 </script>
 </head>
 <body>
 Trwa ładowanie...
 </body>
 </html>

test.php

 <!-- Aby udostępnić ten dokument dla swojej witryny, zamień <ejohn.org> na adres swojej domeny 
 (np. <twojadomena.pl>); aby zezwolić na dostęp WSZYSTKIM domenom, wpisz <*>. -->
 <?php header('Access-Control: allow <ejohn.org>'); ?>
 <b>John Resig</b>

Instrukcje przetwarzania kodu XML

Możliwe jest dołączenie do kodu XML dodatkowych poleceń, które definiują sposób obsługi dokumentu przez parser XML. W wersji roboczej specyfikacji Access Control określono jedno z tych poleceń, umożliwiające zdalny dostęp do danego dokumentu XML z witryn zewnętrznych.

Na przykład umieszczenie w dokumencie XML następującej instrukcji przetwarzania pozwoli wszystkim witrynom z domeny mozilla.org na dostęp do tego dokumentu:

 <?access-control allow="mozilla.org"?>

Poniżej podano kilka przykładów zastosowania instrukcji przetwarzania, służących do przyznania uprawnień dostępu do dokumentu XML:

 // Dostęp do zasobu mogą uzyskać wszyscy, bez ograniczeń
 <?access-control allow="*"?>

 // Dostęp do zasobu jest zabroniony dla wszystkich, bez wyjątków
 <?access-control deny="*"?>

 // Dostęp do zasobu można uzyskać wyłącznie z domeny 'mozilla.org'
 // (włącznie z poddomenami)
 <?access-control deny="mozilla.org"?>

 // Dostęp do zasobu można uzyskać ze wszystkich poddomen domeny 'mozilla.org'
 // z wyjątkiem poddomeny developer.mozilla.org
 <?access-control allow="mozilla.org" exclude="developer.mozilla.org"?>

 // Dostęp do zasobu można uzyskać wyłącznie z określonej domeny oraz przy użyciu
 // określonego portu i określonej metody
 <?access-control allow="developer.mozilla.org" method="GET POST"?>

Więcej przykładowych poleceń można znaleźć w roboczej wersji specyfikacji W3C Access Control.

Przykład

W tym prostym przykładzie zewnętrzna witryna WWW wysyła żądanie pliku XML. Plik ten zawiera instrukcje przetwarzania, które pozwalają na dostęp do dokumentu wszystkim witrynom. Po skopiowaniu pliku ac.html na własny serwer zauważysz, że żądanie jest nadal obsługiwane poprawnie — zezwolenie na jego wysłanie zostało bowiem udzielone wszystkim witrynom.

ac.html

 <html>
 <head>
 <script>
 window.onload = function(){
   var xhr = new XMLHttpRequest();
   xhr.open("GET", "http://dev.jquery.com/~john/xdomain/test.xml", true);
   xhr.onreadystatechange = function(){
     if ( xhr.readyState == 4 ) {
       if ( xhr.status == 200 ) {
         document.body.innerHTML = "Nazywam się: " +
           xhr.responseXML.getElementsByTagName("name")[0].firstChild.nodeValue;
       } else {
         document.body.innerHTML = "BŁĄD";
       }
     }
   };
   xhr.send(null);
 };
 </script>
 </head>
 <body>
 Loading...
 </body>
 </html>

test.xml

 <!-- Aby udostępnić ten dokument dla swojej witryny, zamień atrybut allow="ejohn.org" na adres swojej domeny 
 (np. allow="twojadomena.pl"); aby zezwolić na dostęp WSZYSTKIM domenom, wpisz allow="*". -->
 <?xml version="1.0" encoding="UTF-8"?>
 <?access-control allow="ejohn.org"?>
 <simple><name>John Resig</name></simple>

Odnośniki

Zobacz także

Autorzy i etykiety dokumentu

 Autorzy tej strony: teoli, Flaneur, Mgjbot
 Ostatnia aktualizacja: teoli,