SpringBoot と Vue の相互作用におけるクロスドメイン問題の解決策

SpringBoot と Vue の相互作用におけるクロスドメイン問題の解決策

こんにちは、バグを書くのが本当に得意なプログラマーのグレイ・エイプです。

ブラウザ同一生成元ポリシー

クロスドメインの問題はなぜ発生するのでしょうか? まず、ブラウザのホモロジー ポリシーである定義を理解する必要があります。

ブラウザの同一生成元ポリシーとは何ですか? 簡単に言うと、ブラウザがリクエストを送信するために使用するプロトコル、ドメイン名、ポートは、サーバーがリクエストを受信するために使用するプロトコル、ドメイン名、ポートと一致している必要があります。これは相互作用を完了する唯一の方法ですが、明らかに不可能であり、特に同じコンピューター上でフロントエンドとバックエンドが分離されたプロジェクトを開発する場合は、2 つのポートを使用する必要があります。これにより、クロスドメインの問題が発生します。

ここでは、クロスドメインの問題を解決するために使用した 2 つの方法を紹介します。

1. VUEフロントエンド構成プロキシはクロスドメインの問題を解決します

(1)ブラウザリクエストがVueでクッキーを運ぶことを許可する

まず、クロスドメインの問題を発見した経緯をお話しします。最初は、フロントエンド ブラウザからバックエンドにリクエストを送信するときに、ブラウザの Cookie を転送しませんでしたが、これではブラウザのリクエストを検証することができませんでした。そこで、その後、リクエストを送信するたびにブラウザが http リクエスト ヘッダーに Cookie を転送する方法を使用しました。方法は次のとおりです。

vue の main.js メソッドに次のコードを記述します。

// axios 依存関係を導入する import axios from 'axios'
//リクエストにブラウザのクッキーを渡す
axios.defaults.withCredentials=true
Vue.prototype.$axios = axios

上記は、axios リクエスト、つまり ajax リクエストを導入し、同時に資格情報の書き込みを有効にすることを意味します。Cookie は、withCredentials が true に等しい場合にのみ送信されます。

(2)クロスドメイン問題を解決するためにVueでプロキシを設定する

Vue でクロスドメイン問題を解決するのは実はとても簡単です。ブラウザがリクエストを送信するたびに、URL の前半が同じでなければならないからです (例http://localhost:8080/blogshttp://localhost:8080/login 。同一の URL を抽出し、 axios.defaults.baseURLにカプセル化することができます。このようにして、リクエストを行うたびにリクエスト アドレスを“/blogs”に短縮できます。これは、URL ヘッダーの単純なカプセル化と同じです。

注: axios.defaults.baseURL =
"http://localhost:8080"
を設定しますaxios.defaults.baseURL =
"http://localhost:8080"
axios.js にaxios.defaults.baseURL =
"http://localhost:8080"
と記述する必要があります

しかし、クロスドメインの問題を解決するときは、 axios.defaults.baseURL = "http://localhost:8080"axios.defaults.baseURL = “/api”と記述する必要があります。
この方法では、各リクエストのパスの前に“/api”が付きます。
これも最初のステップです。

最初のステップは、統一されたアクセスパスを設定することです

axios.js で、 axios.defaults.baseURL = "http://localhost:8080"寫成axios.defaults.baseURL = "/api"設定します。

ステップ2: クロスドメインプロキシを構成する

babel.config.jsと同じディレクトリに新しいjsファイルvue.config.jsを作成します。

ここに画像の説明を挿入

そこに次のコードを記述します。このコードは、クロスドメイン問題を解決するために構成されたプロキシです。私のバックエンド サーバーのリクエスト接続は http://localhost:8081 です。これと異なる場合は、変更する必要があります。

/**
 * クロスドメインの問題を解決する* @type {{devServer: {proxy: {"/api": {changeOrigin: boolean, pathRewrite: {"^/api": string}, target: string}}, host: string, open: boolean}}}
 */
モジュール.エクスポート = {
    開発サーバー: {
        ホスト: 'localhost',
        open: true, // ブラウザを自動的に開きます // プロキシ設定テーブル。対応する API インターフェースへの特定のリクエスト プロキシを設定できます // たとえば、'localhost:8080/api/xxx' を 'www.example.com/api/xxx' にプロキシします
        プロキシ: {
            '/api': { // '/api' で始まるすべてのリクエスト パスに一致しますtarget: 'http://localhost:8081', // プロキシ ターゲットのベース パス//secure: false, // https インターフェースの場合は、このパラメータを構成する必要がありますchangeOrigin: true, // クロスドメイン パスをサポートしますRewrite: { // パスの書き換え: パスの先頭の '/api' を削除します
                    '^/api': ''
                }
            }
        }
    }
}

ステップ3: テストリクエスト

今すぐログイン要求を送信する場合、要求は次のように記述する必要があります。

this.$axios.post("/ログイン")

2. Springbootバックエンド構成はクロスドメインの問題を解決します

Springboot フレームワークのバックエンドでクロスドメイン問題を解決するには、CorsConfig クラスを追加し、WebMvcConfigurer インターフェースを実装するだけです。コードは次のとおりです。通常は、開発中にコードをコピーするだけで済みます。

org.springframework.context.annotation.Configuration をインポートします。
org.springframework.web.servlet.config.annotation.CorsRegistry をインポートします。
org.springframework.web.servlet.config.annotation.WebMvcConfigurer をインポートします。

/**
 * クロスドメインの問題を解決する */
@構成
パブリッククラスCorsConfigはWebMvcConfigurerを実装します{

    @オーバーライド
    パブリック void addCorsMappings(CorsRegistry レジストリ) {
        レジストリ.addMapping("/**")
                .allowedOriginPatterns("*")
                .allowedMethods("GET"、"HEAD"、"POST"、"PUT"、"DELETE"、"OPTIONS")
                .allowCredentials(true)
                .最大年齢(3600)
                .allowedHeaders("*");

    }
}

上記は、クロスドメインの問題を解決するために私が使用した 2 つの方法です。インターネット上でもクロスドメインの問題を解決する方法がたくさん見つかりましたが、どれも複雑でした。自分で試して調べた結果、上記 2 つの方法がうまくテストできました。その時点では、フロントエンドとバックエンドの両方が構成されていました。

ですので、異なる意見やより良い方法がありましたら、遠慮なくご指摘ください。

私はGray Apeです。また次回お会いしましょう!

画像の説明を追加してください

SpringBoot と Vue の相互作用におけるクロスドメイン問題の解決法に関するこの記事はこれで終わりです。SpringBoot と Vue の相互作用に関するより関連性の高いコンテンツについては、123WORDPRESS.COM の以前の記事を検索するか、以下の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • SpringBoot+Spring Securityではクロスドメインソリューションを実現できない
  • Springboot 2.4.0 へのアップグレードにおけるクロスドメイン問題の分析と修正
  • Springboot のクロスドメイン問題に対する 3 つの解決策
  • vue+springboot フロントエンドとバックエンド分離プロジェクトにおけるクロスドメイン問題に対するソリューションの分析
  • Springboot クロスドメイン問題の解決
  • SpringBoot クロスドメインソリューション
  • Spring用のいくつかのクロスドメインソリューション

<<:  MySQL関連のツールをいくつかお勧めします

>>:  よく使われる HTML 形式のタグ_Powernode Java Academy

推薦する

Linux での VMWare15.5 のインストールに関するチュートリアル

Linux に VMWare をインストールするには、公式 Web サイト https://www....

MySQL データベースの基礎: 基本コマンドの概要

目次1. ヘルプ情報を使用する2. データベースの作成、削除、表示3. データベースに接続する4. ...

Linux で削除できないファイル/フォルダの解決方法

序文最近、弊社のサーバーがハッカーの攻撃を受け、一部のファイルの属性が変更されたため、ウイルスファイ...

VMware で VMware ツールをインストールしてもインストール ファイルが表示されない問題を解決する方法

VMware ツールは VMware の使用に非常に便利です。そのため、VMware ツールをインス...

NavicatがMySQL8.0.11に接続するとエラー2059が発生する

間違いNavicat Premium を使用して MySQL に接続すると、次のエラーが発生します。...

W3C チュートリアル (9): W3C XPath アクティビティ

XPath は、XML ドキュメントの一部を選択するための言語です。 XPath は、XSLT、XQ...

Nginx のリロード プロセスの背後にある真実を探る

本日の記事では、主にNginxのリロードプロセスについて紹介します。実は前回の記事では、nginx ...

@font-face を使用して Web ページに特殊文字を実装する (カスタム フォントを作成する)

数日前、CSS を使用して三角形の矢印を実装する方法について記事を書きました。 目的の効果は達成され...

WeChatミニプログラムにナビゲーション機能を実装する方法

1. レンダリング2. 操作手順1. テンセントマップキーを申請する - 住所2. ミニプログラムの...

MySQL ストアド プロシージャの原理と使用法の詳細な説明

この記事では、例を使用して、MySQL ストアド プロシージャの原理と使用方法を説明します。ご参考ま...

シーケンス関数を実装する MySQL コード

MySQLはシーケンス関数を実装する1. シーケンスレコードテーブルを作成する テーブル `sys_...

Centos7でファイルをバックアップするときは、バックアップファイルにバックアップの日付を追加します

Linux は、システム内のデバイス、インターフェース、ファイル、スタートアップ、アプリケーション ...

Vue 仮想 Dom から実際の Dom への変換

別のツリー構造があるJavascriptオブジェクトでは、このツリーが本物であると伝えるだけでよいD...

MySQLの連結関数CONCATの使い方の詳しい説明

前回の記事では、MySQL の置換関数 (Replace) とセグメンテーション関数 (SubStr...

Vue+Openlayerはグラフィックスのドラッグと回転変形効果を実現します

目次序文関連資料成果を達成する実装手順序文Openlayer には独自の拡張プラグイン ol-ext...