ホームページ ウェブフロントエンド jsチュートリアル Koa2 フレームワークの CORS を使用してクロスドメイン Ajax リクエストを完了する方法

Koa2 フレームワークの CORS を使用してクロスドメイン Ajax リクエストを完了する方法

Mar 28, 2018 am 11:50 AM
cors koa2 仕上げる

今回は、Koa2 フレームワークの CORS を使用してクロスドメイン Ajax リクエストを完了する方法を説明します。Koa2 フレームワークの CORS を使用してクロスドメイン Ajax リクエストを完了するときに注意すべき注意事項とは何ですか。実際のケースを見てみましょう。

クロスドメイン Ajax リクエストを実装するには多くの方法がありますが、その 1 つは CORS を使用することであり、この方法の鍵はサーバー側で設定することです。

この記事では、通常のクロスドメイン Ajax 応答を完了できる最も基本的な設定のみを説明します (詳細な設定の方法はわかりません)。

CORS はリクエストを単純なリクエストと単純でないリクエストに分割します。単純に、追加のリクエスト ヘッダーのない get リクエストと post リクエスト と考えることができます。post リクエストの場合、リクエストの形式は application/json にすることはできません。 (私はこの分野について深く理解していないため。間違いがあれば、誰かが間違いを指摘し、修正を提案してくれることを願っています)。残りの put リクエストと post リクエスト、Content-Type application/json を含むリクエスト、およびカスタム リクエスト ヘッダーを含むリクエストは、単純ではないリクエストです。

単純なリクエストの構成は非常に簡単で、目的を達成するために応答を完了する必要がある場合は、応答ヘッダーで Access-Control-Allow-Origin を構成するだけです。

http://localhost:3000 ドメイン名の下にある http://127.0.0.1:3001 ドメイン名にアクセスしたい場合。次の設定を行うことができます:

app.use(async (ctx, next) => {
 ctx.set('Access-Control-Allow-Origin', 'http://localhost:3000');
 await next();
});
ログイン後にコピー

次に、ajax を使用して post リクエストなどの単純なリクエストを開始すると、サーバーから正しい応答を簡単に取得できます。

実験用コードは以下のとおりです:

$.ajax({
  type: 'post',
  url: 'http://127.0.0.1:3001/async-post'
 }).done(data => {
  console.log(data);
})
ログイン後にコピー

サーバー側コード:

router.post('/async-post',async ctx => {
 ctx.body = {
 code: "1",
 msg: "succ"
 }
});
ログイン後にコピー

これにより、正しい応答情報を取得できます。

このときのリクエストとレスポンスのヘッダー情報を見ると、リクエストヘッダーには追加のorigin(リクエストのURLアドレスのリファラーもあります)があり、レスポンスヘッダーには追加の Access-Control-Allow-Origin。

これで単純なリクエストを送信できるようになりましたが、単純でないリクエストを送信するには他の設定が必要です。

初めて非単純なリクエストが発行されると、実際には 2 つのリクエストが発行されます。最初のリクエストは、このリクエストの リクエストメソッド が渡されるかどうかによってこのタイプが決まります。単純でないリクエストに正常に応答できるかどうか。

サーバー上でこの OPTIONS タイプのリクエストを照合するには、この事前チェックを通過できるように、照合して応答を返すミドルウェアを作成する必要があります。

app.use(async (ctx, next) => {
 if (ctx.method === 'OPTIONS') {
 ctx.body = '';
 }
 await next();
});
ログイン後にコピー

このようにして、OPTIONS リクエストを渡すことができます。

プリフライトリクエストのリクエストヘッダーを確認すると、さらに 2 つのリクエストヘッダーがあることがわかります。

Access-Control-Request-Method: PUT
Origin: http://localhost:3000
ログイン後にコピー

これら 2 つのヘッダー情報を介してサーバーとネゴシエートし、サーバーの応答条件を満たしているかどうかを確認します。

理解するのは簡単ですが、リクエストヘッダーにはさらに 2 つの情報が含まれているため、レスポンスヘッダーには当然、対応する 2 つの情報が含まれます。 2 つの情報は次のとおりです。

Access-Control-Allow-Origin: http://localhost:3000
Access-Control-Allow-Methods: PUT,DELETE,POST,GET
ログイン後にコピー
ログイン後にコピー

最初の情報は同じです。が原点であるため、通過します。 2 番目の情報は Access-Controll-Request-Method に対応し、サーバーが許可する応答メソッドにリクエスト メソッドが含まれている場合、この情報も渡されます。両方の制約が満たされるため、リクエストは正常に開始されます。

ここまでは、事前チェックのみを完了し、実際のリクエストを送信しないことと同じです。

もちろん、実際のリクエストもレスポンスを正常に受信しており、レスポンスヘッダーは次のとおりです(重要でない部分は省略しています)

Access-Control-Allow-Origin: http://localhost:3000
Access-Control-Allow-Methods: PUT,DELETE,POST,GET
ログイン後にコピー
ログイン後にコピー

リクエストヘッダーは次のとおりです:

Origin: http://localhost:3000
ログイン後にコピー

これは非常に明白であり、レスポンスヘッダー情報は次のように設定されています私たちはサーバー上にいます、そうです。

クライアントは、Access-Control-Request-Method リクエスト ヘッダーを送信する必要はありません。これは、直前に事前チェックされているためです。

この例のコードは次のとおりです:

$.ajax({
   type: 'put',
   url: 'http://127.0.0.1:3001/put'
  }).done(data => {
   console.log(data);
});
ログイン後にコピー

サーバー コード:

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();
});
ログイン後にコピー

この時点で、クロスドメイン Ajax 応答を正しく実行するための基本構成が完了しました。さらに構成できるものがいくつかあります。

たとえば、これまでのところ、すべての非単純リクエストは実際に 2 つのリクエスト (プリフライト用と実際のリクエスト用) を発行するため、パフォーマンスの低下が発生します。プリフライトリクエストを送信しないようにするには、次の応答ヘッダーを設定できます。

Access-Control-Max-Age: 86400
ログイン後にコピー

这个响应头的意义在于,设置一个相对时间,在该非简单请求在服务器端通过检验的那一刻起,当流逝的时间的毫秒数不足Access-Control-Max-Age时,就不需要再进行预检,可以直接发送一次请求。

当然,简单请求时没有预检的,因此这条代码对简单请求没有意义。

目前代码如下:

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();
});
ログイン後にコピー

到现在为止,可以对跨域ajax请求进行响应了,但是该域下的cookie不会被携带在请求头中。如果想要带着cookie到服务器,并且允许服务器对cookie进一步设置,还需要进行进一步的配置。

为了便于后续的检测,我们预先在http://127.0.0.1:3001这个域名下设置两个cookie。注意不要错误把cookie设置成中文(刚才我就设置成了中文,结果报错,半天没找到出错原因)

然后我们要做两步,第一步设置响应头Access-Control-Allow-Credentials为true,然后在客户端设置xhr对象的withCredentials属性为true。

客户端代码如下:

$.ajax({
   type: 'put',
   url: 'http://127.0.0.1:3001/put',
   data: {
    name: '黄天浩',
    age: 20
   },
   xhrFields: {
    withCredentials: true
   }
  }).done(data => {
   console.log(data);
  });
ログイン後にコピー

服务端如下:

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();
});
ログイン後にコピー

这时就可以带着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();
});
ログイン後にコピー

这样就可以不用*通配符也可匹配多个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();
});
ログイン後にコピー

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

相信看了本文案例你已经掌握了方法,更多精彩请关注php中文网其它相关文章!

推荐阅读:

在Vue2.0中http请求以及loading的展示

process和child_process使用详解

以上がKoa2 フレームワークの CORS を使用してクロスドメイン Ajax リクエストを完了する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

Flask-CORS を使用してクロスドメインのリソース共有を実現する方法 Flask-CORS を使用してクロスドメインのリソース共有を実現する方法 Aug 02, 2023 pm 02:03 PM

Flask-CORS を使用してクロスドメイン リソース共有を実現する方法 はじめに: ネットワーク アプリケーション開発において、クロスドメイン リソース共有 (CrossOriginResourceSharing、CORS と呼ばれる) は、サーバーが指定されたソースまたはドメイン名とリソースを共有できるようにするメカニズムです。 CORS を使用すると、異なるドメイン間のデータ送信を柔軟に制御し、安全で信頼性の高いクロスドメイン アクセスを実現できます。この記事では、Flask-CORS 拡張ライブラリを使用して CORS 機能を実装する方法を紹介します。

PHP-Slim フレームワークで CORS クロスドメイン リクエストを使用するにはどうすればよいですか? PHP-Slim フレームワークで CORS クロスドメイン リクエストを使用するにはどうすればよいですか? Jun 03, 2023 am 08:10 AM

Web 開発では、クロスドメイン リクエストがよくある問題です。これは、ブラウザーには異なるドメイン名間のリクエストに対して厳しい制限があるためです。たとえば、Web サイト B がクロスドメイン リクエストを許可しない限り、Web サイト A のフロントエンド コードは Web サイト B の API にリクエストを直接送信できません。この問題を解決するために、CORS (Cross-Origin Resource Sharing) テクノロジーが登場しました。この記事では、PHP-Slim フレームワークで CORS クロスドメイン リクエストを使用する方法を紹介します。 1. CORSCORS とは何ですか? これは、対応する HTTP ヘッダーにいくらかの量を追加するメカニズムです。

Golang を使用して RESTful API を構築し、CORS を実装するにはどうすればよいですか? Golang を使用して RESTful API を構築し、CORS を実装するにはどうすればよいですか? Jun 02, 2024 pm 05:52 PM

RESTful API を作成して CORS を実装する: プロジェクトを作成し、依存関係をインストールします。リクエストを処理するために HTTP ルーティングを設定します。ミドルウェアCORS ミドルウェアを使用してクロスオリジン リソース共有 (CORS) を有効にします。 CORS ミドルウェアをルーターに適用して、任意のドメインからの GET および OPTIONS リクエストを許可します。

Beego フレームワークで CORS を使用してクロスドメインの問題を解決する Beego フレームワークで CORS を使用してクロスドメインの問題を解決する Jun 04, 2023 pm 07:40 PM

Web アプリケーションの開発とインターネットのグローバル化に伴い、クロスドメイン要求を行う必要があるアプリケーションがますます増えています。クロスドメインリクエストはフロントエンド開発者にとって一般的な問題であり、アプリケーションが適切に動作しなくなる可能性があります。この場合、クロスオリジンリクエストの問題を解決する最良の方法の 1 つは、CORS を使用することです。この記事では、Beego フレームワークで CORS を使用してクロスドメインの問題を解決する方法に焦点を当てます。クロスドメインリクエストとは何ですか? Web アプリケーションでは、クロスドメイン リクエストとは、あるドメイン名の Web ページから別のドメイン名の Web ページへのリクエストを指します。

Springboot が CORS クロスドメインの問題を解決する方法は何ですか? Springboot が CORS クロスドメインの問題を解決する方法は何ですか? May 13, 2023 pm 04:55 PM

1. WebMvcConfigurer インターフェイスを実装します。 @ConfigurationpublicclassWebConfigimplementsWebMvcConfigurer{/***クロスドメイン サポートを追加します*/@OverridepublicvoidaddCorsMappings(CorsRegistryregistry){//クロスドメイン アクセスを許可するパス '/**' は、アプリケーション レジストリのすべてのメソッドを表します。addMapping ("/** ")//クロスドメインアクセスを許可するソース'*

くぼみの中で失われた宝箱を見つける方法 くぼみの中で失われた宝箱を見つける方法 Jan 22, 2024 pm 05:30 PM

ゼロゾーンの洞窟で失われた宝箱を取り戻すにはどうすればよいですか?このダンジョンにはたくさんの箱がありますが、あちこちに箱が点在しているため、見つけられない人も多いと思いますが、すぐに箱を見つけてダンジョンをクリアする方法を紹介します。デッドゾーンの穴に失われた宝箱を取り戻すタスクを完了するにはどうすればよいですか? ロープネットにコミッションポストが表示されます; 具体的な分析: 1. まずロープネットに行き、コミッションポストを見ることができます [回収]穴に落ちた宝箱] を選択し、メッセージを送信を選択します。 2.交換と交換の後、この委託タスクを受け取ることができ、その後、この練習を開始できます。 3. 次に、このミッションのロックを解除するには穴に入る必要があります。 4. その後、洞窟泥棒から依頼を受け、大量のギアコインを入手できます。 5. 穴から抜け出す必要がある

PHP 通信: クロスドメインのデータ送信を実現するにはどうすればよいですか? PHP 通信: クロスドメインのデータ送信を実現するにはどうすればよいですか? Aug 20, 2023 am 11:17 AM

PHP 通信: クロスドメインのデータ送信を実現するにはどうすればよいですか?はじめに: Web 開発では、多くの場合、異なるドメイン名間でのデータ送信を実現する必要があり、これにはクロスドメイン通信が必要です。この記事では、PHP 言語を使用してクロスドメイン データ送信を実現する方法を紹介し、コード例を添付します。 1. クロスドメイン通信とは何ですか?クロスドメイン通信とは、Web 開発における異なるドメイン名間でのデータ送信のプロセスを指します。通常、ブラウザーは、同一オリジン ポリシーの制限により、ページが異なるドメインのサーバーにリクエストを送信したり、応答を受信したりすることを防ぎます。したがって、異なるドメイン間で実装するには

私の Go プログラムが CORS ミドルウェアを正しく使用しないのはなぜですか? 私の Go プログラムが CORS ミドルウェアを正しく使用しないのはなぜですか? Jun 10, 2023 pm 01:54 PM

今日のインターネット アプリケーションでは、クロスオリジン リソース共有 (CORS) が一般的に使用されており、Web サイトがさまざまなドメインのリソースにアクセスできるようになります。開発プロセス中、特に CORS ミドルウェアを使用する場合に、いくつかの問題が発生することがよくあります。この記事では、Go プログラムが CORS ミドルウェアを正しく使用していない理由を調査し、これらの問題の解決策を提供します。 CORS ミドルウェアが有効になっていることを確認する まず、Go プログラムで CORS ミドルウェアが有効になっていることを確認します。有効になっていない場合、プログラムは次のことを行うことができません。

See all articles