Koa2 フレームワークを通じて CORS を使用してクロスドメイン Ajax リクエストを実装する方法
この記事では主に、CORS を使用してクロスドメイン Ajax リクエストを完了するための Koa2 フレームワークを紹介し、参考として提供します。
クロスドメイン 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 であるかどうかによって決まります。リクエストが正常に応答できるかどうか。
サーバー上でこの 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 の下に 2 つの Cookie を設定します。間違って Cookie を中国語に設定しないように注意してください (中国語に設定したところ、エラーが報告されました。エラーの原因は長い間見つかりませんでした)
次に、2 つのステップを実行する必要があります。最初の手順では、応答ヘッダー 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(); });
这样就减少了多余的响应头。
上面是我整理给大家的,希望今后会对大家有帮助。
相关文章:
以上がKoa2 フレームワークを通じて CORS を使用してクロスドメイン Ajax リクエストを実装する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ホットAIツール

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

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

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

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

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

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

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

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

ホットトピック









プロジェクトドキュメント管理に GitLab を使用する方法 1. 背景の紹介 ソフトウェア開発プロセスにおいて、プロジェクトドキュメントは非常に重要な情報であり、開発チームがプロジェクトのニーズと設計を理解するのに役立つだけでなく、テストチームの参考にもなります。そして顧客。プロジェクト ドキュメントのバージョン管理とチーム コラボレーションを容易にするために、プロジェクト ドキュメント管理に GitLab を使用できます。 GitLab は Git をベースとしたバージョン管理システムであり、コード管理をサポートするだけでなく、プロジェクト ドキュメントの管理も行うことができます。 2. GitLabの環境設定 まず、

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

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

世界的に有名なショートビデオソーシャルプラットフォームとして、Douyin は独自のパーソナライズされた推奨アルゴリズムで多くのユーザーの支持を獲得しています。この記事では、読者がこの機能をよりよく理解し、最大限に活用できるように、Douyin ビデオ レコメンデーションの価値と原則について詳しく説明します。 1. Douyin 推奨ビデオとは何ですか? Douyin 推奨ビデオは、インテリジェントな推奨アルゴリズムを使用して、ユーザーの興味や行動習慣に基づいてパーソナライズされたビデオ コンテンツをフィルタリングしてプッシュします。 Douyin プラットフォームは、ユーザーの視聴履歴、いいねやコメントの行動、共有記録、その他のデータを分析し、膨大な動画ライブラリからユーザーの好みに最適な動画を選択して推奨します。このパーソナライズされたレコメンデーション システムは、ユーザー エクスペリエンスを向上させるだけでなく、ユーザーが自分の好みに合ったビデオ コンテンツをより多く発見できるようにすることで、ユーザーの定着率と維持率を向上させます。この時点で

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

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

コンピュータ ハードウェアの継続的な発展に伴い、プロセッサ内の CPU コアは個別にクロック周波数を高めるのではなく、コアの数が増加しています。これにより、これらのコアを最大限に活用するにはどうすればよいかという明らかな疑問が生じます。解決策の 1 つは、複数のタスクを同時に実行して CPU コアを最大限に活用する並列プログラミングによるものです。これは Go 言語のユニークな機能であり、同時プログラミング用に特別に設計された言語です。この記事では、同時プログラミングに Go 言語を活用する方法を検討します。コルーチン まず理解する必要があります

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