Heim Web-Frontend js-Tutorial So implementieren Sie domänenübergreifende Ajax-Anfragen mithilfe von CORS über das Koa2-Framework

So implementieren Sie domänenübergreifende Ajax-Anfragen mithilfe von CORS über das Koa2-Framework

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

In diesem Artikel wird hauptsächlich das Koa2-Framework zur Verwendung von CORS zur Vervollständigung domänenübergreifender Ajax-Anfragen vorgestellt. Jetzt teile ich es mit Ihnen und gebe es als Referenz.

Es gibt viele Möglichkeiten, domänenübergreifende Ajax-Anfragen zu implementieren. Eine davon ist die Verwendung von CORS. Der Schlüssel zu dieser Methode besteht darin, sie auf der Serverseite zu konfigurieren.

In diesem Artikel wird nur die grundlegendste Konfiguration erläutert, die eine normale domänenübergreifende Ajax-Antwort durchführen kann (ich weiß nicht, wie man eine detaillierte Konfiguration durchführt).

CORS unterteilt Anfragen in einfache Anfragen und nicht einfache Anfragen. Man kann einfach davon ausgehen, dass einfache Anfragen Get- und Post-Anfragen ohne zusätzliche Anfrageheader sind, und wenn es sich um eine Post-Anfrage handelt, kann das Anfrageformat nicht angewendet werden /json (da ich in diesem Bereich kein tiefes Verständnis habe. Wenn ein Fehler auftritt, hoffe ich, dass jemand auf den Fehler hinweisen und Änderungen vorschlagen kann). Der Rest, Put- und Post-Anfragen, Anfragen mit Content-Type application/json und Anfragen mit benutzerdefinierten Anfrage-Headern sind nicht einfache Anfragen.

Die Konfiguration einer einfachen Anfrage ist sehr einfach. Wenn Sie nur die Antwort vervollständigen müssen, um das Ziel zu erreichen, müssen Sie nur den Access-Control-Allow-Origin im Antwortheader konfigurieren.

Wenn wir auf den Domänennamen http://127.0.0.1:3001 unter dem Domänennamen http://localhost:3000 zugreifen möchten. Sie können die folgende Konfiguration vornehmen:

app.use(async (ctx, next) => {
 ctx.set('Access-Control-Allow-Origin', 'http://localhost:3000');
 await next();
});
Nach dem Login kopieren

Dann verwenden Sie Ajax, um eine einfache Anfrage zu initiieren, beispielsweise eine Post-Anfrage, und Sie können problemlos die richtige Antwort vom Server erhalten.

Der experimentelle Code lautet wie folgt:

$.ajax({
  type: 'post',
  url: 'http://127.0.0.1:3001/async-post'
 }).done(data => {
  console.log(data);
})
Nach dem Login kopieren

Serverseitiger Code:

router.post('/async-post',async ctx => {
 ctx.body = {
 code: "1",
 msg: "succ"
 }
});
Nach dem Login kopieren

Dann können Sie die richtigen Antwortinformationen erhalten.

Wenn Sie sich zu diesem Zeitpunkt die Header-Informationen der Anfrage und Antwort ansehen, werden Sie feststellen, dass der Anfrage-Header einen zusätzlichen Ursprung hat (es gibt auch einen Verweis auf die URL-Adresse der Anfrage) und die Der Antwortheader verfügt über einen zusätzlichen Access-Control-Allow-Origin.

Sie können jetzt einfache Anfragen senden, Sie benötigen jedoch noch andere Konfigurationen, um nicht einfache Anfragen zu senden.

Wenn eine nicht einfache Anfrage zum ersten Mal gestellt wird, werden tatsächlich zwei Anfragen ausgegeben. Die erste ist eine Preflight-Anfrage. Die Anfragemethode dieser Anfrage bestimmt, ob dies der Fall ist Die Anfrage wird übergeben. Ob die Art der nicht einfachen Anfrage erfolgreich beantwortet werden kann.

Um diese Anfrage vom Typ OPTIONS auf dem Server abzugleichen, müssen Sie eine entsprechende Middleware erstellen und eine Antwort geben, damit diese Vorprüfung bestanden werden kann.

app.use(async (ctx, next) => {
 if (ctx.method === 'OPTIONS') {
 ctx.body = '';
 }
 await next();
});
Nach dem Login kopieren

Auf diese Weise kann die OPTIONS-Anfrage passieren.

Wenn Sie den Anforderungsheader der Preflight-Anfrage überprüfen, werden Sie feststellen, dass es zwei weitere Anforderungsheader gibt.

Access-Control-Request-Method: PUT
Origin: http://localhost:3000
Nach dem Login kopieren

Verhandeln Sie mit dem Server über diese beiden Header-Informationen, um zu sehen, ob er die Antwortbedingungen des Servers erfüllt.

Da der Anforderungsheader zwei weitere Informationen enthält, sollte der Antwortheader natürlich zwei entsprechende Informationen enthalten:

Access-Control-Allow-Origin: http://localhost:3000
Access-Control-Allow-Methods: PUT,DELETE,POST,GET
Nach dem Login kopieren
Nach dem Login kopieren

Die erste Information und Herkunft Das Gleiche gilt also. Die zweite Information entspricht der Access-Controll-Request-Method. Wenn die Request-Methode in der vom Server zugelassenen Antwortmethode enthalten ist, wird diese Information ebenfalls übergeben. Beide Einschränkungen sind erfüllt, sodass die Anfrage erfolgreich initiiert werden kann.

Bis zu diesem Zeitpunkt ist es gleichbedeutend damit, nur die Vorprüfung durchzuführen und nicht die eigentliche Anfrage zu senden.

Natürlich hat die eigentliche Anfrage auch erfolgreich die Antwort erhalten, und der Antwortheader lautet wie folgt (ohne unwichtige Teile)

Access-Control-Allow-Origin: http://localhost:3000
Access-Control-Allow-Methods: PUT,DELETE,POST,GET
Nach dem Login kopieren
Nach dem Login kopieren

Der Anforderungsheader lautet wie folgt:

Origin: http://localhost:3000
Nach dem Login kopieren

Das ist offensichtlich. Die Antwort-Header-Informationen sind das, was wir auf dem Server festlegen, also ist das der Grund.

Der Client muss den Access-Control-Request-Method-Anfrageheader nicht senden, da er gerade vorab überprüft wurde.

Der Code für dieses Beispiel lautet wie folgt:

$.ajax({
   type: 'put',
   url: 'http://127.0.0.1:3001/put'
  }).done(data => {
   console.log(data);
});
Nach dem Login kopieren

Servercode:

app.use(async (ctx, next) => {
  ctx.set('Access-Control-Allow-Origin', 'http://localhost:3000');
  ctx.set('Access-Control-Allow-Methods', 'PUT,DELETE,POST,GET');
  await next();
});
Nach dem Login kopieren

An diesem Punkt haben wir die Grundkonfiguration abgeschlossen, die eine domänenübergreifende Ajax-Antwort korrekt durchführen kann , und es gibt einige, die noch etwas weiter konfiguriert werden können.

Beispielsweise werden bisher bei jeder nicht einfachen Anfrage tatsächlich zwei Anfragen ausgegeben, eine für den Preflight und eine für eine echte Anfrage, was zu einem Leistungsverlust führt. Um keine Preflight-Anfrage zu senden, können Sie die folgenden Antwortheader konfigurieren.

Access-Control-Max-Age: 86400
Nach dem Login kopieren

Die Bedeutung dieses Antwortheaders besteht darin, eine relative Zeit ab dem Zeitpunkt festzulegen, an dem die nicht einfache Anforderung den Test auf der Serverseite besteht, wenn die verstrichene Zeit in Millisekunden kleiner als Access-Control-Max ist. Alter: Es ist kein Preflight erforderlich und Sie können direkt eine Anfrage senden.

Natürlich gibt es für einfache Anfragen keinen Preflight, daher ist dieser Code für einfache Anfragen bedeutungslos.

Der aktuelle Code lautet wie folgt:

app.use(async (ctx, next) => {
 ctx.set('Access-Control-Allow-Origin', 'http://localhost:3000');
 ctx.set('Access-Control-Allow-Methods', 'PUT,DELETE,POST,GET');
 ctx.set('Access-Control-Max-Age', 3600 * 24);
 await next();
});
Nach dem Login kopieren

Bisher können Sie auf domänenübergreifende Ajax-Anfragen antworten, aber die Cookies unter dieser Domäne werden nicht im Anfrageheader übertragen. Wenn Sie das Cookie zum Server bringen und dem Server erlauben möchten, das Cookie weiter zu setzen, ist eine weitere Konfiguration erforderlich.

Um die spätere Erkennung zu erleichtern, setzen wir vorab zwei Cookies unter dem Domainnamen http://127.0.0.1:3001. Achten Sie darauf, das Cookie nicht versehentlich auf Chinesisch zu setzen (ich habe es gerade auf Chinesisch eingestellt und es hat einen Fehler gemeldet. Ich konnte die Fehlerursache lange nicht finden)

Dann müssen wir es tun Führen Sie zwei Schritte aus. Der erste Schritt besteht darin, den Antwortheader Access-Control-Allow auf true zu setzen und dann das withCredentials-Attribut des xhr-Objekts auf true zu setzen.

Der Client-Code lautet wie folgt:

$.ajax({
   type: 'put',
   url: 'http://127.0.0.1:3001/put',
   data: {
    name: '黄天浩',
    age: 20
   },
   xhrFields: {
    withCredentials: true
   }
  }).done(data => {
   console.log(data);
  });
Nach dem Login kopieren

Der Server-Code lautet wie folgt:

app.use(async (ctx, next) => {
  ctx.set('Access-Control-Allow-Origin', 'http://localhost:3000');
  ctx.set('Access-Control-Allow-Methods', 'PUT,DELETE,POST,GET');
  ctx.set('Access-Control-Allow-Credentials', true);
  await next();
});
Nach dem Login kopieren

这时就可以带着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('Access-Control-Allow-Origin', ctx.request.header.origin);
  ctx.set('Access-Control-Allow-Methods', 'PUT,DELETE,POST,GET');
  ctx.set('Access-Control-Allow-Credentials', true);
  ctx.set('Access-Control-Max-Age', 3600 * 24);
 }
 await next();
});
Nach dem Login kopieren

这样就可以不用*通配符也可匹配多个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('Access-Control-Allow-Origin', ctx.request.header.origin);
  ctx.set('Access-Control-Allow-Credentials', true);
 }
 await next();
});

app.use(async (ctx, next) => {
 if (ctx.method === 'OPTIONS') {
  ctx.set('Access-Control-Allow-Methods', 'PUT,DELETE,POST,GET');
  ctx.set('Access-Control-Max-Age', 3600 * 24);
  ctx.body = '';
 }
 await next();
});
Nach dem Login kopieren

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

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

相关文章:

webpack打包js的方法

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

angular5 httpclient的示例实战

Das obige ist der detaillierte Inhalt vonSo implementieren Sie domänenübergreifende Ajax-Anfragen mithilfe von CORS über das Koa2-Framework. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn

Heiße KI -Werkzeuge

Undresser.AI Undress

Undresser.AI Undress

KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover

AI Clothes Remover

Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool

Undress AI Tool

Ausziehbilder kostenlos

Clothoff.io

Clothoff.io

KI-Kleiderentferner

AI Hentai Generator

AI Hentai Generator

Erstellen Sie kostenlos Ai Hentai.

Heißer Artikel

R.E.P.O. Energiekristalle erklärten und was sie tun (gelber Kristall)
3 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Beste grafische Einstellungen
3 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. So reparieren Sie Audio, wenn Sie niemanden hören können
3 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25: Wie man alles in Myrise freischaltet
4 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌

Heiße Werkzeuge

Notepad++7.3.1

Notepad++7.3.1

Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version

SublimeText3 chinesische Version

Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1

Senden Sie Studio 13.0.1

Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6

Dreamweaver CS6

Visuelle Webentwicklungstools

SublimeText3 Mac-Version

SublimeText3 Mac-Version

Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

So verwenden Sie GitLab für die Projektdokumentenverwaltung So verwenden Sie GitLab für die Projektdokumentenverwaltung Oct 20, 2023 am 10:40 AM

So verwenden Sie GitLab für die Projektdokumentenverwaltung 1. Hintergrundeinführung Im Softwareentwicklungsprozess sind Projektdokumente sehr wichtige Informationen. Sie können dem Entwicklungsteam nicht nur helfen, die Anforderungen und das Design des Projekts zu verstehen, sondern auch als Referenz für das Testteam dienen und Kunden. Um die Versionskontrolle und Teamzusammenarbeit von Projektdokumenten zu erleichtern, können wir GitLab für die Projektdokumentenverwaltung verwenden. GitLab ist ein auf Git basierendes Versionskontrollsystem. Es unterstützt nicht nur die Codeverwaltung, sondern kann auch Projektdokumente verwalten. 2. Einrichtung der GitLab-Umgebung Zuerst I

So verwenden Sie Flask-CORS, um eine domänenübergreifende gemeinsame Nutzung von Ressourcen zu erreichen So verwenden Sie Flask-CORS, um eine domänenübergreifende gemeinsame Nutzung von Ressourcen zu erreichen Aug 02, 2023 pm 02:03 PM

So verwenden Sie Flask-CORS, um eine domänenübergreifende Ressourcenfreigabe zu erreichen. Einführung: Bei der Entwicklung von Netzwerkanwendungen ist die domänenübergreifende Ressourcenfreigabe (CrossOriginResourceSharing, kurz CORS) ein Mechanismus, der es dem Server ermöglicht, Ressourcen mit bestimmten Quellen oder Domänennamen zu teilen. Mit CORS können wir die Datenübertragung zwischen verschiedenen Domänen flexibel steuern und einen sicheren und zuverlässigen domänenübergreifenden Zugriff erreichen. In diesem Artikel stellen wir vor, wie Sie die Flask-CORS-Erweiterungsbibliothek zum Implementieren der CORS-Funktionalität verwenden.

Wie verwende ich eine domänenübergreifende CORS-Anfrage im PHP-Slim-Framework? Wie verwende ich eine domänenübergreifende CORS-Anfrage im PHP-Slim-Framework? Jun 03, 2023 am 08:10 AM

In der Webentwicklung sind domänenübergreifende Anfragen ein häufiges Problem. Dies liegt daran, dass Browser strenge Beschränkungen für Anfragen zwischen verschiedenen Domänennamen haben. Beispielsweise kann der Front-End-Code von Website A keine Anfragen direkt an die API von Website B senden, es sei denn, Website B erlaubt domänenübergreifende Anfragen. Um dieses Problem zu lösen, wurde die CORS-Technologie (Cross-Origin Resource Sharing) entwickelt. In diesem Artikel wird die Verwendung domänenübergreifender CORS-Anfragen im PHP-Slim-Framework vorgestellt. 1. Was ist CORSCORS? Es handelt sich um einen Mechanismus, der dem entsprechenden HTTP-Header einige Beträge hinzufügt.

Was bedeutet das von Douyin empfohlene Video? Wie verwende ich Douyin, um Videos zu empfehlen? Was bedeutet das von Douyin empfohlene Video? Wie verwende ich Douyin, um Videos zu empfehlen? Mar 27, 2024 pm 03:01 PM

Als weltbekannte soziale Plattform für Kurzvideos hat Douyin mit seinem einzigartigen personalisierten Empfehlungsalgorithmus die Gunst einer großen Anzahl von Nutzern gewonnen. Dieser Artikel befasst sich mit dem Wert und den Prinzipien der Douyin-Videoempfehlung, um den Lesern zu helfen, diese Funktion besser zu verstehen und optimal zu nutzen. 1. Was ist das von Douyin empfohlene Video? Das von Douyin empfohlene Video verwendet intelligente Empfehlungsalgorithmen, um personalisierte Videoinhalte basierend auf ihren Interessen und Verhaltensgewohnheiten zu filtern und an sie weiterzugeben. Die Douyin-Plattform analysiert den Sehverlauf der Nutzer, ihr Like- und Kommentarverhalten, teilt Aufzeichnungen und andere Daten, um aus einer riesigen Videobibliothek Videos auszuwählen und zu empfehlen, die den Vorlieben der Nutzer am besten entsprechen. Dieses personalisierte Empfehlungssystem verbessert nicht nur das Benutzererlebnis, sondern hilft Benutzern auch dabei, mehr Videoinhalte zu entdecken, die ihren Vorlieben entsprechen, und erhöht so die Benutzerbindung und -bindungsrate. bei diesem

Wie erstellt man eine RESTful-API und implementiert CORS mit Golang? Wie erstellt man eine RESTful-API und implementiert CORS mit Golang? Jun 02, 2024 pm 05:52 PM

Erstellen Sie eine RESTful-API und implementieren Sie CORS: Erstellen Sie das Projekt und installieren Sie Abhängigkeiten. Richten Sie HTTP-Routing ein, um Anfragen zu verarbeiten. Aktivieren Sie die ursprungsübergreifende Ressourcenfreigabe (CORS) mithilfe der MiddlewareCORS-Middleware. Wenden Sie CORS-Middleware auf den Router an, um GET- und OPTIONS-Anfragen von jeder Domäne aus zuzulassen.

Verwendung von CORS im Beego-Framework zur Lösung domänenübergreifender Probleme Verwendung von CORS im Beego-Framework zur Lösung domänenübergreifender Probleme Jun 04, 2023 pm 07:40 PM

Mit der Entwicklung von Webanwendungen und der Globalisierung des Internets müssen immer mehr Anwendungen domänenübergreifende Anfragen stellen. Domainübergreifende Anfragen sind ein häufiges Problem für Frontend-Entwickler und können dazu führen, dass Anwendungen nicht ordnungsgemäß funktionieren. In diesem Fall ist die Verwendung von CORS eine der besten Möglichkeiten, das Problem ursprungsübergreifender Anforderungen zu lösen. In diesem Artikel konzentrieren wir uns auf die Verwendung von CORS im Beego-Framework zur Lösung domänenübergreifender Probleme. Was ist eine domänenübergreifende Anfrage? In Webanwendungen beziehen sich domänenübergreifende Anfragen auf Anfragen von einer Webseite eines Domänennamens zu einem anderen

Wie verwende ich die Go-Sprache für die gleichzeitige Programmierung? Wie verwende ich die Go-Sprache für die gleichzeitige Programmierung? Jun 10, 2023 am 10:33 AM

Mit der kontinuierlichen Weiterentwicklung der Computer-Hardware erhöhen die CPU-Kerne im Prozessor nicht mehr einzeln die Taktfrequenz, sondern erhöhen die Anzahl der Kerne. Dies wirft eine offensichtliche Frage auf: Wie kann man diese Kerne optimal nutzen? Eine Lösung ist die parallele Programmierung, bei der mehrere Aufgaben gleichzeitig ausgeführt werden, um die CPU-Kerne vollständig auszunutzen. Dies ist eine einzigartige Funktion der Go-Sprache, einer Sprache, die speziell für die gleichzeitige Programmierung entwickelt wurde. In diesem Artikel untersuchen wir, wie man die Go-Sprache für die gleichzeitige Programmierung nutzen kann. Coroutinen Zuerst müssen wir verstehen

Auf welche Weise löst Springboot domänenübergreifende CORS-Probleme? Auf welche Weise löst Springboot domänenübergreifende CORS-Probleme? May 13, 2023 pm 04:55 PM

1. Implementieren Sie die WebMvcConfigurer-Schnittstelle @ConfigurationpublicclassWebConfigimplementsWebMvcConfigurer{/***Fügen Sie domänenübergreifende Unterstützung hinzu*/@OverridepublicvoidaddCorsMappings(CorsRegistryregistry){//Der Pfad, der den domänenübergreifenden Zugriff ermöglicht „/**“, repräsentiert alle Methoden der Anwendungsregistrierung.addMapping ("/** ")//Quellen, die domänenübergreifenden Zugriff ermöglichen'*

See all articles