Vue は Axios リクエスト フロントエンドのクロスドメイン問題をどのように解決するのか

Vue は Axios リクエスト フロントエンドのクロスドメイン問題をどのように解決するのか

序文

最近、純粋なフロントエンドの vue プロジェクトを書いていたときに、axios がローカル リソースを要求したときに access が 404 を報告するという問題が発生しました。これは私にとって非常に不快なことです。情報を確認したところ、クロスドメインの問題であることが判明しました。

通常の開発におけるクロスドメインの問題には多くの解決策があります。最も一般的なのは、バックエンドが応答ヘッダーを変更することです。しかし、フロントエンドはリバースプロキシを通じて解決することもできます。次回このようなミスが起きないように、記録してまとめておきましょう。

それでは、復習して解決してみましょう。

1. クロスドメインの問題はなぜ発生するのでしょうか?

クロスドメイン: ブラウザが、あるドメイン名の Web ページのリソースを別のドメイン名から要求する場合、ドメイン名、ポート、またはプロトコルが異なると、クロスドメインになります。

フロントエンドとバックエンドの分離モードでは、フロントエンドとバックエンドのドメイン名が一致せず、クロスドメインアクセスの問題が発生してしまいます。クロスドメイン問題は、JavaScript の同一生成元ポリシーに起因します。つまり、プロトコル + ホスト名 + ポート番号 (存在する場合) が同じ場合にのみ相互アクセスが許可されます。つまり、JavaScript は自身のドメインの下にあるリソースにのみアクセスして操作することができ、他のドメインの下にあるリソースにアクセスして操作することはできません。クロスドメインの問題は、JS と ajax に発生します。 Axios は Promise を介して Ajax テクノロジーをカプセル化したものなので、クロスドメインの問題もあります。

2. 解決策

ここでは、このマシンを使用して、テスト用に 2 つの異なるポートを開きます。

未処理のクロスドメイン エラー

クロスドメイン処理要求はありません。

 axios.get('http://localhost:8080/getData')
 .then(res => {
   コンソール.log(res)
 })
 .catch(エラー => {
   コンソールエラー(err); 
 })

クロスオリジンリソース共有 (CORS)

フロントエンドは、クロスドメインの問題を解決するためにリバースプロキシを実行します。概略図は以下のとおりです。

1. vueプロジェクトのポートは8081です

2. コンピューターのポート 8080 を開き、 /getDataを要求すると json データが返されます。

3. プロキシを設定する

1. vue2.0の場合

config フォルダー内の index.js ファイルを変更し、proxyTable に次のコードを追加します。

   プロキシテーブル: {
      '/apis': {
        target: 'http://localhost:8080/', // クロスドメインを解決するドメイン名 interfacesecure:false, // https インターフェースの場合は、このパラメータを設定する必要がありますchangeOrigin: true, // インターフェースがクロスドメインの場合は、このパラメータを設定する必要がありますpathRewrite: {
          '^/apis': '' // パスの書き換え}
      },
    },

次に、axiosリクエストにこれを記述します

 axios.get('apis/getData')
 .then(res => {
   コンソール.log(res)
 })
 .catch(エラー => {
   コンソールエラー(err); 
 })

分析:

ターゲットの後に、リクエストする必要のある URL のパブリック部分が続き、これをプロキシするために/apisが使用されます。最後に、いくつかのパスが書き換えられ、リクエスト時にプロキシ apis がプレフィックスとして使用されます。

このプレフィックスはカスタマイズ可能で、proxyTable はオブジェクトなので、複数のプロキシを設定できます。

クロスドメインソリューション

2. vue3.0の場合

vue-cli3 スキャフォールディングが構築された後、プロジェクトディレクトリに vue.config.js ファイルが存在しないため、手動で作成する必要があります。

新しい vue.config.js を作成し、次の情報を構成して問題を解決します。

モジュール.エクスポート = {   
    開発サーバー: {
        プロキシ: {
            '^/api': {
                target: 'http://localhost:8080/', //インターフェースプレフィックス ws:true, //プロキシwebsocked
                changeOrigin:true, //仮想サイトのオリジンを変更する必要があります
                パス書き換え:{
                    '^/api':''//パスを書き換えます}
            }
        }
    }
}

まとめ:

changeOrigin: true : プロキシをオンにします。ローカルに偽のサーバーが作成され、要求されたデータが同時に送受信されるため、サーバーとサーバーが相互に対話できるようになります。

apisは実際のインターフェースリクエストのプレフィックスであり、実際のインターフェースプレフィックスのパブリック部分、つまりプロトコル+ホスト名+ポート番号をプロキシします。

たとえば、リクエストインターフェースがlocalhost:8080/getData渡す必要があるのはgetDataだけです。
すると、パブリック ドメイン名はlocalhost:8080/となり、リクエスト インターフェイスのパブリック ドメイン名localhost:8080/api/に変更するだけです。

プロジェクトを実行すると、インターフェースリクエストのパスがlocalhost:8081/apis/getDataであることがわかります。

プロキシに入った後の実際のリクエストパスは次のようになります: localhost:8080/getData

最後に

学習中は、公式ドキュメントをもっと読む必要があります。クロスドメインやその他の設定の問題については、公式ドキュメントにも多くの設定情報が記載されています。vue cliの設定

最近の現象を要約すると、死ぬほど疲れ果てない限り、死ぬまで一生懸命働くだろう、ということです。さあ、みんな。

これで、Vue が axios リクエストのフロントエンド クロスドメイン問題を解決する方法についての記事は終わりです。Vue が axios リクエストのフロントエンド クロスドメイン問題を解決する方法についての関連コンテンツについては、123WORDPRESS.COM で以前の記事を検索するか、次の関連記事を引き続き参照してください。今後も 123WORDPRESS.COM を応援していただければ幸いです。

以下もご興味があるかもしれません:
  • Vue3はaxiosのクロスドメイン実装プロセス分析を構成する
  • vue-cli 3.x は Axios (proxyTable) クロスドメイン プロキシ メソッドを設定します
  • vue cli3 で axios を使用する際のクロスドメイン問題を解決する
  • Vue3.0 axios クロスドメイン リクエスト プロキシ サーバーの設定方法

<<:  mysql 更新ケース更新フィールド値が固定されていない操作

>>:  Docker ポート マッピングと外部アクセス不可の問題

推薦する

JavaScript ベースで年・月・日の 3 階層連携を実現

この記事では、年、月、日の3段階のリンクを実現するためのJavaScriptの具体的なコードを参考ま...

Linuxのファイルとフォルダの権限を操作する方法

Linux のファイル権限まず、現在のディレクトリ内のファイルの内容を確認しましょう。 ls -l ...

Dockerを使用してMySQL 8.0をデプロイする方法の例

1. 公式サイトを参照してdockerをインストールする2. MySQLイメージをプルします(デフォ...

「いいね!」文がインデックスに登録されないのはなぜですか?

序文この記事は、最も人気のある言語で最も退屈な基礎知識を説明することを目的としていますこのトピックは...

XHTML でのハイパーリンク タグの使用に関するチュートリアル

ハイパーリンク。「リンク」とも呼ばれます。ハイパーリンクは、私たちが閲覧する Web ページのいたる...

Vue のプロダクション環境と開発環境を切り替えてフィルターを使用する方法

目次1. 本番環境と開発環境を切り替える最初の方法: .envファイルを設定する2番目の方法2. フ...

コード標準では、SQL ステートメントに結合が多すぎないようにする必要があるのはなぜですか?

無料ポイントインタビュアー:Linuxを使ったことはありますか?私:はいインタビュアー:メモリ使用量...

MySQL データベースに基づくデータ制約の例と 5 つの整合性制約の紹介

非準拠データがデータベースに入るのを防ぐために、ユーザーがデータを挿入、変更、削除、その他の操作を行...

MySQL 8.0.15 圧縮版インストール グラフィック チュートリアル

この記事では、参考までにMySQL 8.0.15圧縮版のインストール方法を紹介します。具体的な内容は...

Vueのフロントエンドとバックエンドのポートの不一致の問題を解決する

Vue のフロントエンドとバックエンドのポートが一致していませんconfig index.jsファイ...

MySQL 8.0.16 圧縮パッケージのインストールと設定方法のグラフィックチュートリアル

この記事では、MySQL 8.0.16圧縮パッケージのインストールと設定方法を参考までに紹介します。...

VMWare仮想マシンのcentosの時間が現地時間と矛盾する問題を解決する

VM Ware 仮想マシン CentOS の時刻は、次の図に示すように、現地時間と一致しません。おそ...

CSS のサイズ単位についての簡単な説明

ブラウザの互換性はどんどん良くなってきています。モバイル端末は基本的にすべてWebKitベースです。...

JenkinsのLinuxインストール手順と各種問題解決(ページアクセス初期化パスワード)

1. Java環境jdk1.8を準備するJavaがインストールされているかどうかを確認します。イン...

JavaScript で外部変数にアクセスするサブ関数の 3 つのソリューション

序文Web ページを作成するときに、次のような状況に遭遇することはよくあります。 <本文>...