Avant de parler d'XMLHttpRequest cross-domain, il est nécessaire de définir ce qu'est le principe
cross-domain.
Le cross-domain
Cross-domain signifie
croisement de domaine. C'est un principe qui vise à faire communiquer deux domaines ensemble. Par exemple,
monsite.com peut envoyer des données à
tonsite.com, tout comme ce dernier peut renvoyer des données à
monsite.com.
La plupart des techniques AJAX ne sont pas cross-domain pour des raisons évidentes de sécurité. Pour qu'une application cross-domain fonctionne, il faut que le domaine qui reçoit la requête soit autorisé à la traiter. C'est une mesure de sécurité obligatoire.
Il faut donc que le domaine à qui la requête est envoyée soit autorisé à répondre. Pour ce faire, on utilise l'
Access Control, qui sera détaillé par la suite.
XMLHttpRequest et XDomainRequest
Faire communiquer deux scripts présents en des domaines différents est impossible avec XMLHttpRequest, dans sa spécification première.
Tous les navigateurs implémentent XMLHttpRequest dans sa spécification première (Level 1) qui ne permet pas de faire du cross-domain. Le W3C travaille sur la spécification 2 (Level 2) qui autorise le cross-domain.
Différences de point de vue
Pour résumer, pendant que le W3C travaille sur la deuxième spécification d'XMLHttpRequest, Microsoft implémente dans Internet Explorer 8 sa propre version du cross-domain, baptisée
XDomainRequest. Microsoft justifie ce choix par le fait que la nouvelle version d'XMLHttpRequet ne le satisfait pas. La grosse différence entre XDomainRequest (
XDR) et XHR est que ce n'est pas le même objet qui est utilisé, ce qui permet de ne pas s'embrouiller et de bien différencier les deux techniques.
Je vais donc vous parler des deux techniques bien qu'elles ne soient pas encore vraiment utilisables, car seul IE8 gère XDomainRequest et... aucun autre navigateur ne gère la version 2 d'XMLHttpRequest.
En réalité c'est faux, Firefox 3 gère la version 2 d'XHR, mais seulement dans les extensions, et non dans les pages Web. Le problème (parce que c'est bien un bug) est corrigé dans la version 3.1 Beta 1 !
On va commencer par voir comment instancier ce nouvel objet, pour nous verrons le fonctionnement d'Access Control.