1. Communication de messages entre documents
La communication de messages entre documents peut garantir une communication inter-sources sécurisée entre les iframes, les onglets et les fenêtres. Il définit l'API postMessage comme moyen standard d'envoyer des messages. Il est très simple d'utiliser postMessage pour envoyer des messages. Le code est le suivant :
chatFrame.contextWindow.postMessage('Hello,world','http://www.example.com');
Lors de la réception. messages, il suffit de cliquer sur la page Ajouter une fonction de gestion d'événements. Lorsqu'un message arrive, la source du message est vérifiée pour déterminer s'il faut traiter le message.
L'événement message est un événement DOM avec des attributs de données et d'origine. L'attribut data est le message réel délivré par l'expéditeur et l'attribut origin est la source d'envoi.
L'API postMessage est non seulement capable de communiquer entre des documents de même origine, mais elle est également utile lorsque le navigateur n'autorise pas les communications non originales. De par sa cohérence et sa facilité d'utilisation, postMessage est également recommandé lors de la communication entre documents de même origine. L'API postMessage doit toujours être utilisée lors de la communication dans un environnement JavaScript, par exemple lors de la communication avec HTML5 Web Workers.
1.1 Comprendre la sécurité de l'origine
HTML5 Rongguang introduit le concept d'origine pour clarifier et améliorer la sécurité du domaine. Une origine est un sous-ensemble d'adresses utilisé pour établir des relations de confiance sur le réseau. La source se compose de règles (schéma), d'hôte (hôte) et de port (poste).
Le chemin n'est pas pris en compte dans la notion de source.
HTML5 définit la sérialisation des sources. Les sources apparaissent sous forme de chaînes dans les API et les protocoles.
Les règles de sécurité PostMessage garantissent que les messages ne sont pas transmis à des pages sources involontaires. Lors de l'envoi d'un message, c'est l'expéditeur qui précise la source du destinataire. Si la fenêtre utilisée par l'expéditeur pour appeler postMessage n'a pas d'origine spécifique (par exemple, l'utilisateur a sauté vers un autre site), le navigateur ne délivrera pas le message.
De même, lors de la réception d'un message, la source de l'expéditeur est également incluse dans le message. Pour éviter toute falsification, la source du message est fournie par le navigateur. Le destinataire peut décider quels messages traiter et lesquels ignorer. Nous pouvons conserver une liste blanche et demander au navigateur de traiter uniquement les messages provenant de sources fiables.
Il est préférable de ne jamais évaluer les chaînes provenant de tiers. De plus, évitez d’utiliser la méthode eval pour traiter les chaînes internes à l’application. JSON peut être consommé via les analyseurs window.JSON ou json, .org.
1.2 Prise en charge du navigateur pour la communication de messages entre documents
Une approche courante consiste à détecter si l'attribut withCredentials existe dans l'objet XMLHttpRequest :
Code JavaScriptCopier le contenu dans le presse-papiers
-
var xhr = nouveau XMLHttpRequest(); > (typeof xhr.withCredentials === non défini) { //Ne prend pas en charge XMLHttpRequest d'origine croisée } else { //Prend en charge les origine XMLHttpRequest }
1.3 Utilisation de l'API postMessage
Astuces L'interface MessageEvent définie par HTML5 fait également partie de HTML5 WebSockets et HTML5 WebWorkers. La fonction de communication de HTML5 utilise la même API pour recevoir des messages que l'interface MessageEvent. D'autres API de communication, telles que l'API EventSource et Web Workers, utilisent également l'interface MessageEvent pour transmettre des messages.
1.4 Créer une application à l'aide de l'API postMessage Envoyer un message
Vous pouvez envoyer un message en appelant la fonction postMessage() dans l'objet fenêtre de la page cible. Le code est le suivant. suit :
Code JavaScript
Copier le contenu dans le presse-papiers
window.postMessage(-
"Bonjour tout le monde", "porta"); >
Le premier paramètre contient les données à envoyer et le deuxième paramètre est la destination du message. Pour envoyer un message vers une iframe, vous pouvez appeler postMessage dans la contentWindow de l'iframe correspondante. Le code est le suivant :
.
Code JavaScript
Copier le contenu dans le presse-papiers
document.getElementsByTagName(
- "iframe")[0].contentWindow.postMessage("Bonjour tout le monde", "cha");
Écoute des événements de message
Lors de la réception de messages, il vous suffit d'ajouter un gestionnaire d'événements à la page. Lorsqu'un message arrive, la source du message est vérifiée pour déterminer s'il faut traiter le message.
Code JavaScriptCopier le contenu dans le presse-papiers
-
window.postMessage("Bonjour tout le monde", "porta"); >
Un événement de message est un événement DOM avec des attributs de données et d'origine. L'attribut data est le message réel délivré par l'expéditeur et l'attribut origin est la source d'envoi.
La source se compose d'une règle (schéma), d'un hôte (hôte) et d'un port (port).
Par exemple : en raison de règles différentes (telles que https et http), la source de la page est différente.
Le chemin n'est pas pris en compte dans la notion de source. Par exemple : au lieu de simples chemins, il s’agit de la même source.
Les sources apparaissent sous forme de chaînes dans les API et les protocoles.
Code JavaScriptCopier le contenu dans le presse-papiers
-
var originWhiteList = ["porta", "jeu" , ""]; fonction checkWhiteList(origine) { pour (var i=0; iif (origin === originWhiteList[i]) { retour vrai } } retour faux; } fonction messageHandler(e) { if (checkWhiteList(e.origin)) { processMessage(e. data); } else { //Ignorer les messages provenant de sources inconnues } }
L'API postMessage peut être appliquée à la fois aux communications de même origine et aux communications non originales. Compte tenu de sa cohérence, postMessage est également recommandé lors de la communication entre documents homologues.
2 XMLHttpRequest Level2
En tant que version améliorée de XMLHttpRequest, XMLHttpRequest Level2 a considérablement amélioré ses fonctionnalités. Principalement axé sur deux aspects : (1) XMLHttpRequests multi-sources ; Le partage de ressources d'origine (partage de ressources multi-origine) implémente des XMLHttpRequests multi-origines.
Les requêtes HTTP d'origine croisée incluent un en-tête Origin pour fournir au serveur les informations source de la requête HTTP. L'en-tête est protégé par le navigateur et ne peut être modifié par le code de l'application. Essentiellement, il a le même effet que l'attribut d'origine d'un événement de message dans la communication de messages entre documents.
La spécification CORS exige que certains comportements sensibles, tels que les demandes de demande de certificat ou les demandes de contrôle en amont OPTIONS autres que GET et POST, doivent être envoyés par le navigateur au serveur pour déterminer si ce comportement peut être pris en charge et quelle autorisation. signifie qu'une communication réussie peut devoir être prise en charge par un serveur doté de capacités CORS.
2.2 Événements de progression
L'une des améliorations les plus importantes de l'API dans la nouvelle version de XMLHttpRequest est l'ajout d'une réponse à la progression.
XMLHttpRequest Level2 utilise un nom significatif Progress pour nommer l'événement de progression.
3 Fonctions avancées3.1 Données structurées
Les premières versions de postMessage ne prennent en charge que les chaînes. Les versions ultérieures prenaient en charge d'autres types de données tels que les objets JavaScript, les imageData de canevas et les fichiers. En raison des différences dans la prise en charge des spécifications entre les différents navigateurs, la prise en charge des différents types d'objets est également différente.
3.2 Framebusting
La technologie Framebusting peut être utilisée pour garantir que certains contenus ne sont pas chargés dans jframe. L'application détecte d'abord si la fenêtre dans laquelle elle se trouve est la fenêtre la plus extérieure (window.top). Sinon, elle sort du cadre qui la contient. Le code est le suivant :
.
Code JavaScript
Copier le contenu dans le presse-papiers
- si(window!=window.top)
- {
- window.top.location=emplacement
- }
3.3 Données binaires
Les navigateurs qui prennent en charge les nouvelles API binaires (telles que Typed Array) peuvent utiliser XMLHttpRequest pour envoyer des données binaires. La spécification de niveau 2 prend en charge l'appel de la méthode send() pour envoyer des objets Blob et ArrayBuffer
Code XML/HTMLCopier le contenu dans le presse-papiers
- var a = nouveau Uint8Array([8,6,7,5,3, 0,9]); var xhr = nouveau XMLHttpRequest(); ", true); console.log(a); xhr.send(a.buffer);
XMLHttpRequest Level 2 expose également les données de réponse binaires. Définissez la valeur de l'attribut réponseType sur texte, document, arraybuffer ou blob pour contrôler le type d'objet renvoyé par l'attribut de réponse. Si vous souhaitez afficher les octets bruts contenus dans le corps de la réponse HTTP, vous devez définir la valeur de l'attribut ResponseTyper sur arraybuffer ou blob.