Maison interface Web js tutoriel Comment implémenter des requêtes ajax inter-domaines à l'aide de CORS via le framework Koa2

Comment implémenter des requêtes ajax inter-domaines à l'aide de CORS via le framework Koa2

Jun 01, 2018 am 11:17 AM
cors koa2 利用

Cet article présente principalement le framework Koa2 pour utiliser CORS pour compléter des requêtes ajax inter-domaines. Maintenant, je le partage avec vous et vous donne une référence.

Il existe de nombreuses façons d'implémenter des requêtes ajax inter-domaines, dont l'une consiste à utiliser CORS, et la clé de cette méthode est de la configurer côté serveur.

Cet article explique uniquement la configuration la plus basique qui peut compléter une réponse ajax inter-domaines normale (je ne sais pas comment faire une configuration approfondie).

CORS divise les requêtes en requêtes simples et requêtes non simples. On peut simplement penser que les requêtes simples sont des requêtes d'obtention et de publication sans en-têtes de requête supplémentaires, et s'il s'agit d'une requête de publication, le format de la requête ne peut pas être une application. /json (car je n'ai pas une compréhension approfondie de ce domaine. S'il y a une erreur, j'espère que quelqu'un pourra signaler l'erreur et suggérer des modifications). Le reste, les requêtes put et post, les requêtes avec Content-Type application/json et les requêtes avec des en-têtes de requête personnalisés sont des requêtes non simples.

La configuration d'une requête simple est très simple. Si vous avez seulement besoin de compléter la réponse pour atteindre l'objectif, il vous suffit de configurer Access-Control-Allow-Origin dans l'en-tête de réponse.

Si nous voulons accéder au nom de domaine http://127.0.0.1:3001 sous le nom de domaine http://localhost:3000. Vous pouvez effectuer la configuration suivante :

app.use(async (ctx, next) => {
 ctx.set('Access-Control-Allow-Origin', 'http://localhost:3000');
 await next();
});
Copier après la connexion

Utilisez ensuite ajax pour lancer une requête simple, telle qu'une demande de publication, et vous pourrez facilement obtenir la réponse correcte du serveur.

Le code expérimental est le suivant :

$.ajax({
  type: 'post',
  url: 'http://127.0.0.1:3001/async-post'
 }).done(data => {
  console.log(data);
})
Copier après la connexion

Code côté serveur :

router.post('/async-post',async ctx => {
 ctx.body = {
 code: "1",
 msg: "succ"
 }
});
Copier après la connexion

Ensuite, vous pouvez obtenir les informations de réponse correctes.

Si vous regardez les informations d'en-tête de la requête et de la réponse à ce moment-là, vous constaterez que l'en-tête de la requête a une origine supplémentaire (il existe également un référent pour l'adresse URL de la requête), et le l’en-tête de réponse a un Access-Control-Allow-Origin supplémentaire.

Vous pouvez désormais envoyer des requêtes simples, mais vous avez toujours besoin d'une autre configuration pour envoyer des requêtes non simples.

Lorsqu'une requête non simple est émise pour la première fois, deux requêtes seront en fait émises. La première est une requête de contrôle en amont. La méthode de requête de cette requête est OPTIONS. la demande est transmise. Indique si le type de demande non simple peut recevoir une réponse réussie.

Afin de faire correspondre cette requête de type OPTIONS sur le serveur, vous devez créer un middleware pour la faire correspondre et donner une réponse afin que cette pré-vérification puisse réussir.

app.use(async (ctx, next) => {
 if (ctx.method === 'OPTIONS') {
 ctx.body = '';
 }
 await next();
});
Copier après la connexion

De cette façon, la demande OPTIONS peut passer.

Si vous vérifiez l'en-tête de la demande de contrôle en amont, vous constaterez qu'il y a deux autres en-têtes de demande.

Access-Control-Request-Method: PUT
Origin: http://localhost:3000
Copier après la connexion

Négociez avec le serveur via ces deux informations d'en-tête pour voir si les conditions de réponse du serveur sont remplies.

C'est facile à comprendre. Puisque l'en-tête de requête contient deux informations supplémentaires, l'en-tête de réponse doit naturellement avoir deux informations correspondantes. Les deux informations sont les suivantes :

Access-Control-Allow-Origin: http://localhost:3000
Access-Control-Allow-Methods: PUT,DELETE,POST,GET
Copier après la connexion
Copier après la connexion
<. 🎜>La première information Identique à l'origine et donc transmise. La deuxième information correspond à Access-Controll-Request-Method Si la méthode de requête est incluse dans la méthode de réponse autorisée par le serveur, cette information passera également. Les deux contraintes sont remplies, la demande peut donc être lancée avec succès.

Jusqu'à présent, cela équivaut à effectuer uniquement la pré-vérification et à ne pas envoyer la demande proprement dite.

Bien sûr, la vraie requête a obtenu avec succès la réponse, et l'en-tête de la réponse est le suivant (les parties sans importance sont omises)

Access-Control-Allow-Origin: http://localhost:3000
Access-Control-Allow-Methods: PUT,DELETE,POST,GET
Copier après la connexion
Copier après la connexion
L'en-tête de la requête est le suivant :

Origin: http://localhost:3000
Copier après la connexion
C'est évidemment le cas. Les informations d'en-tête de réponse sont définies par nous sur le serveur, c'est donc le cas.

Le client n'a pas besoin d'envoyer l'en-tête de requête Access-Control-Request-Method car il vient d'être pré-vérifié.

Le code de cet exemple est le suivant :

$.ajax({
   type: &#39;put&#39;,
   url: &#39;http://127.0.0.1:3001/put&#39;
  }).done(data => {
   console.log(data);
});
Copier après la connexion
Code du serveur :

app.use(async (ctx, next) => {
  ctx.set(&#39;Access-Control-Allow-Origin&#39;, &#39;http://localhost:3000&#39;);
  ctx.set(&#39;Access-Control-Allow-Methods&#39;, &#39;PUT,DELETE,POST,GET&#39;);
  await next();
});
Copier après la connexion
À ce stade, nous avons terminé la configuration de base pour un inter-domaine correct réponse ajax et quelque chose qui peut être configuré davantage.

Par exemple, jusqu'à présent, chaque requête non simple émettra en fait deux requêtes, une pour le contrôle en amont et une pour la requête réelle, ce qui entraînera une perte de performances. Afin de ne pas envoyer de demande de contrôle en amont, vous pouvez configurer les en-têtes de réponse suivants.

Access-Control-Max-Age: 86400
Copier après la connexion
Le sens de cet en-tête de réponse est de fixer un temps relatif à partir du moment où la requête non simple passe le test côté serveur, lorsque le nombre de millisecondes écoulées est inférieur à Access. -Control-Max- Age, il n'est pas nécessaire d'effectuer une pré-vérification et vous pouvez directement envoyer une demande.

Bien sûr, il n'y a pas de contrôle en amont pour les requêtes simples, donc ce code n'a aucun sens pour les requêtes simples.

Le code actuel est le suivant :

app.use(async (ctx, next) => {
 ctx.set(&#39;Access-Control-Allow-Origin&#39;, &#39;http://localhost:3000&#39;);
 ctx.set(&#39;Access-Control-Allow-Methods&#39;, &#39;PUT,DELETE,POST,GET&#39;);
 ctx.set(&#39;Access-Control-Max-Age&#39;, 3600 * 24);
 await next();
});
Copier après la connexion
Jusqu'à présent, vous pouvez répondre aux requêtes ajax inter-domaines, mais les cookies de ce domaine ne seront pas transportés dans l'en-tête de la requête . Si vous souhaitez apporter le cookie au serveur et permettre au serveur de définir davantage le cookie, une configuration supplémentaire est requise.

Afin de faciliter la détection ultérieure, nous installons au préalable deux cookies sous le nom de domaine http://127.0.0.1:3001. Faites attention à ne pas définir le cookie en chinois par erreur (je viens de le définir en chinois, et il a signalé une erreur. Je n'ai pas trouvé la cause de l'erreur pendant longtemps)

Ensuite, nous devons effectuez deux étapes. La première étape consiste à définir l'en-tête de réponse Access-Control-Allow -Credentials sur true, puis à définir l'attribut withCredentials de l'objet xhr sur true sur le client.

Le code client est le suivant :

$.ajax({
   type: &#39;put&#39;,
   url: &#39;http://127.0.0.1:3001/put&#39;,
   data: {
    name: &#39;黄天浩&#39;,
    age: 20
   },
   xhrFields: {
    withCredentials: true
   }
  }).done(data => {
   console.log(data);
  });
Copier après la connexion
Le code serveur est le suivant :

app.use(async (ctx, next) => {
  ctx.set(&#39;Access-Control-Allow-Origin&#39;, &#39;http://localhost:3000&#39;);
  ctx.set(&#39;Access-Control-Allow-Methods&#39;, &#39;PUT,DELETE,POST,GET&#39;);
  ctx.set(&#39;Access-Control-Allow-Credentials&#39;, true);
  await next();
});
Copier après la connexion

这时就可以带着cookie到服务器了,并且服务器也可以对cookie进行改动。但是cookie仍是http://127.0.0.1:3001域名下的cookie,无论怎么操作都在该域名下,无法访问其他域名下的cookie。

现在为止CORS的基本功能已经都提到过了。

一开始我不知道怎么给Access-Control-Allow-Origin,后来经人提醒,发现可以写一个白名单数组,然后每次接到请求时判断origin是否在白名单数组中,然后动态的设置Access-Control-Allow-Origin,代码如下:

app.use(async (ctx, next) => {
 if (ctx.request.header.origin !== ctx.origin && whiteList.includes(ctx.request.header.origin)) {
  ctx.set(&#39;Access-Control-Allow-Origin&#39;, ctx.request.header.origin);
  ctx.set(&#39;Access-Control-Allow-Methods&#39;, &#39;PUT,DELETE,POST,GET&#39;);
  ctx.set(&#39;Access-Control-Allow-Credentials&#39;, true);
  ctx.set(&#39;Access-Control-Max-Age&#39;, 3600 * 24);
 }
 await next();
});
Copier après la connexion

这样就可以不用*通配符也可匹配多个origin了。

注意:ctx.origin与ctx.request.header.origin不同,ctx.origin是本服务器的域名,ctx.request.header.origin是发送请求的请求头部的origin,二者不要混淆。

最后,我们再稍微调整一下自定义的中间件的结构,防止每次请求都返回Access-Control-Allow-Methods以及Access-Control-Max-Age,这两个响应头其实是没有必要每次都返回的,只是第一次有预检的时候返回就可以了。

调整后顺序如下:

app.use(async (ctx, next) => {
 if (ctx.request.header.origin !== ctx.origin && whiteList.includes(ctx.request.header.origin)) {
  ctx.set(&#39;Access-Control-Allow-Origin&#39;, ctx.request.header.origin);
  ctx.set(&#39;Access-Control-Allow-Credentials&#39;, true);
 }
 await next();
});

app.use(async (ctx, next) => {
 if (ctx.method === &#39;OPTIONS&#39;) {
  ctx.set(&#39;Access-Control-Allow-Methods&#39;, &#39;PUT,DELETE,POST,GET&#39;);
  ctx.set(&#39;Access-Control-Max-Age&#39;, 3600 * 24);
  ctx.body = &#39;&#39;;
 }
 await next();
});
Copier après la connexion

这样就减少了多余的响应头。

上面是我整理给大家的,希望今后会对大家有帮助。

相关文章:

webpack打包js的方法

vue 简单自动补全的输入框的示例

angular5 httpclient的示例实战

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn

Outils d'IA chauds

Undresser.AI Undress

Undresser.AI Undress

Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover

AI Clothes Remover

Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

AI Hentai Generator

AI Hentai Generator

Générez AI Hentai gratuitement.

Article chaud

R.E.P.O. Crystals d'énergie expliqués et ce qu'ils font (cristal jaune)
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Meilleurs paramètres graphiques
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Comment réparer l'audio si vous n'entendez personne
4 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25: Comment déverrouiller tout dans Myrise
1 Il y a quelques mois By 尊渡假赌尊渡假赌尊渡假赌

Outils chauds

Bloc-notes++7.3.1

Bloc-notes++7.3.1

Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Comment utiliser GitLab pour la gestion des documents de projet Comment utiliser GitLab pour la gestion des documents de projet Oct 20, 2023 am 10:40 AM

Comment utiliser GitLab pour la gestion des documents de projet 1. Introduction générale Dans le processus de développement logiciel, les documents de projet sont des informations très importantes. Ils peuvent non seulement aider l'équipe de développement à comprendre les besoins et la conception du projet, mais également fournir une référence à l'équipe de test. et les clients. Afin de faciliter le contrôle de version et la collaboration en équipe sur les documents de projet, nous pouvons utiliser GitLab pour la gestion des documents de projet. GitLab est un système de contrôle de version basé sur Git. En plus de prendre en charge la gestion du code, il peut également gérer les documents de projet. 2. Configuration de l'environnement GitLab Tout d'abord, je

Comment utiliser Flask-CORS pour réaliser le partage de ressources entre domaines Comment utiliser Flask-CORS pour réaliser le partage de ressources entre domaines Aug 02, 2023 pm 02:03 PM

Comment utiliser Flask-CORS pour réaliser le partage de ressources entre domaines Introduction : Dans le développement d'applications réseau, le partage de ressources entre domaines (CrossOriginResourceSharing, appelé CORS) est un mécanisme qui permet au serveur de partager des ressources avec des sources ou des noms de domaine spécifiés. Grâce à CORS, nous pouvons contrôler de manière flexible la transmission de données entre différents domaines et obtenir un accès inter-domaines sûr et fiable. Dans cet article, nous présenterons comment utiliser la bibliothèque d'extensions Flask-CORS pour implémenter la fonctionnalité CORS.

Comment utiliser la requête inter-domaines CORS dans le framework PHP-Slim ? Comment utiliser la requête inter-domaines CORS dans le framework PHP-Slim ? Jun 03, 2023 am 08:10 AM

Dans le développement Web, les requêtes inter-domaines sont un problème courant. En effet, les navigateurs imposent des restrictions strictes sur les requêtes entre différents noms de domaine. Par exemple, le code frontal du site Web A ne peut pas envoyer de requêtes directement à l'API du site Web B à moins que le site Web B n'autorise les requêtes inter-domaines. Afin de résoudre ce problème, la technologie CORS (Cross-Origin Resource Sharing) a vu le jour. Cet article explique comment utiliser les requêtes inter-domaines CORS dans le framework PHP-Slim. 1. Qu'est-ce que CORSCORS ? C'est un mécanisme qui ajoute des montants à l'en-tête HTTP correspondant.

Que signifie la vidéo recommandée par TikTok ? Comment utiliser Douyin pour recommander des vidéos ? Que signifie la vidéo recommandée par TikTok ? Comment utiliser Douyin pour recommander des vidéos ? Mar 27, 2024 pm 03:01 PM

En tant que plateforme sociale de vidéos courtes de renommée mondiale, Douyin a gagné la faveur d'un grand nombre d'utilisateurs grâce à son algorithme de recommandation personnalisé unique. Cet article approfondira la valeur et les principes de la recommandation vidéo Douyin pour aider les lecteurs à mieux comprendre et à utiliser pleinement cette fonctionnalité. 1. Qu'est-ce que la vidéo recommandée par Douyin ? La vidéo recommandée par Douyin utilise des algorithmes de recommandation intelligents pour filtrer et proposer du contenu vidéo personnalisé aux utilisateurs en fonction de leurs intérêts et de leurs habitudes comportementales. La plateforme Douyin analyse l'historique de visionnage des utilisateurs, le comportement des likes et des commentaires, les enregistrements de partage et d'autres données pour sélectionner et recommander les vidéos qui correspondent le mieux aux goûts des utilisateurs à partir d'une immense vidéothèque. Ce système de recommandation personnalisé améliore non seulement l'expérience utilisateur, mais aide également les utilisateurs à découvrir davantage de contenu vidéo correspondant à leurs préférences, améliorant ainsi la fidélité des utilisateurs et leur taux de rétention. à ceci

Comment créer une API RESTful et implémenter CORS à l'aide de Golang ? Comment créer une API RESTful et implémenter CORS à l'aide de Golang ? Jun 02, 2024 pm 05:52 PM

Créez une API RESTful et implémentez CORS : créez le projet et installez les dépendances. Configurez le routage HTTP pour gérer les demandes. Activez le partage de ressources d'origine croisée (CORS) à l'aide du middleware middlewareCORS. Appliquez le middleware CORS au routeur pour autoriser les requêtes GET et OPTIONS provenant de n'importe quel domaine.

Comment utiliser le langage Go pour la programmation simultanée ? Comment utiliser le langage Go pour la programmation simultanée ? Jun 10, 2023 am 10:33 AM

Avec le développement continu du matériel informatique, les cœurs du processeur n'augmentent plus individuellement la fréquence d'horloge, mais augmentent le nombre de cœurs. Cela soulève une question évidente : comment tirer le meilleur parti de ces cœurs ? Une solution consiste à programmer en parallèle, ce qui implique l'exécution simultanée de plusieurs tâches pour utiliser pleinement les cœurs du processeur. Il s'agit d'une fonctionnalité unique du langage Go. Il s'agit d'un langage spécialement conçu pour la programmation simultanée. Dans cet article, nous explorerons comment exploiter le langage Go pour la programmation simultanée. Coroutines Tout d'abord, nous devons comprendre

Utilisez CORS dans le framework Beego pour résoudre des problèmes inter-domaines Utilisez CORS dans le framework Beego pour résoudre des problèmes inter-domaines Jun 04, 2023 pm 07:40 PM

Avec le développement des applications Web et la mondialisation d'Internet, de plus en plus d'applications doivent effectuer des requêtes inter-domaines. Les requêtes inter-domaines sont un problème courant pour les développeurs front-end et peuvent empêcher les applications de fonctionner correctement. Dans ce cas, l’un des meilleurs moyens de résoudre le problème des requêtes d’origine croisée consiste à utiliser CORS. Dans cet article, nous nous concentrerons sur la façon d'utiliser CORS dans le framework Beego pour résoudre des problèmes inter-domaines. Qu'est-ce qu'une requête inter-domaines ? Dans les applications Web, les requêtes inter-domaines font référence aux requêtes d'une page Web d'un nom de domaine à une autre.

De quelle manière Springboot résout les problèmes inter-domaines CORS ? De quelle manière Springboot résout les problèmes inter-domaines CORS ? May 13, 2023 pm 04:55 PM

1. Implémentez l'interface WebMvcConfigurer @ConfigurationpublicclassWebConfigimplementsWebMvcConfigurer{/***Ajouter une prise en charge inter-domaines*/@OverridepublicvoidaddCorsMappings(CorsRegistryregistry){//Le chemin qui permet l'accès inter-domaines '/**' représente toutes les méthodes du registre d'application.addMapping ("/** ")//Sources permettant l'accès entre domaines'*

See all articles