跳到主要內容

初探 Vue 呼叫 API 出現 CORS 跨來源資源共享 問題處理

前情提要: 

在 {初探Vue 與 Spring boot 的對話} 專案 ,前端 Vue 應用程式 串接 後端 API 伺服器 ,axios 呼叫 API 時出現以下,”無法取得回應內容 (No 'Access-Control-Allow-Origin' header is present on the requested resource):” 錯誤訊息。














註: 有關  同源政策限制(Same-Origin Policy) 及  跨來源資源共享(CORS) 簡介 可參看 { 初探 Vue 呼叫 API 出現 CORS 跨來源資源共享 問題原因 } 文章



解決 CORS 問題的兩種主要方法


方式一:修改 API 伺服器配置 (推薦)


標準的解決方案。您需要在運行在 http://localhost:8088 的 後端伺服器 上,配置 HTTP 回應標頭,允許來自 http://localhost:8080 的請求。


Spring Boot  (1). 使用 @CrossOrigin 註解 或  (2). 在 Security 配置中新增 Configuration Bean。

這裡使用 @CrossOrigin 註解


例如:


@RestController

@RequestMapping("/api")


// http://localhost:8080 只接受來自來源位址的請求

@CrossOrigin(origins = "http://localhost:8080")


public class UserController {


    @Autowired

    private UserRepository userRepository;


    @GetMapping("/users")

    public List<User> fetchUsers(){

        return userRepository.findAll();

    }

}














方式二:使用 Vite 提供的開發代理(開發環境用)


您可以使用 Vite 內建的開發伺服器(http://localhost:8080)提供的 代理 (Proxy) 功能


利用瀏覽器不會阻止「同源」請求的特性。

原理是:

  1. 您的 Vue 前端呼叫一個相對路徑,例如 /api/users。
  2. Vue 開發伺服器 (http://localhost:8080) 接收到 /api/users 的請求。
  3. Vue 伺服器將這個請求**代理(轉發)**到目標後端 API 伺服器 (http://localhost:8088)。
  4. 由於伺服器之間的通訊不受瀏覽器同源政策限制,後端可以正常回應。



注意! 

1.檢查後端伺服器狀態,確保您的 後端 API 伺服器 (http://localhost:8088) 已經啟動並且正常運行。

您可以直接在瀏覽器中輸入 http://localhost:8088/api/users (或後端實際路徑) 來測試 API 是否能夠獨立存取。


2. vite.config.js,修改配置後,您都必須重新啟動前端開發伺服器,配置才會生效


新增 代理 (Proxy) 功能設定

Vite專案透過 vite.config.ts 檔案設定代理,解決開發環境跨域問題。核心配置包括proxy,設定目標位址和路徑重寫規則。


範例:


vite.config.js


import { defineConfig, loadEnv } from 'vite'

import vue from '@vitejs/plugin-vue'

import vueDevTools from 'vite-plugin-vue-devtools'



export default defineConfig({

  server: {

    proxy: {

      // 將所有 /api 開頭的請求代理到 http://localhost:8088

      '/api': {

        target: 'http://localhost:8088',

        changeOrigin: true,

        //rewrite: (path) => path.replace(/^\/api/, '') // 實際發送給後端時,可能需要移除 /api 前綴,以我的範例要移除

      }

    }

  }

})


總結相關修改:

    修改您的 Axios 請求:

    修改前端的 API 呼叫,將完整的後端 URL 替換為代理路徑:

    原請求: axios.get('http://localhost:8088/api/users')

    修改後: axios.get('/api/users')

    重新啟動您的 Vite 開發伺服器,這個請求就會透過代理繞過 CORS 限制。



打開瀏覽器,http://localhost:8080/ 測試,成功。




































注意!  如果出現,這個錯誤訊息 GET http://localhost:8080/api/users 404 (Not Found) 表示您的 前端 Vue 應用程式 已經成功發出了請求,但 接收請求的伺服器 找不到對應的資源(404 Not Found)





錯誤可能原因


http://localhost:8080 是您 Vue 前端應用程式的開發伺服器 位址。

當您發出請求 axios.get('/api/users') 時,請求會發生兩種情況之一:

1. 如果配置了代理(Proxy): 您的 Vue 開發伺服器 (8080) 收到請求,但它未能成功將請求轉發 (Proxy) 到目標後端 (8088),或者轉發的路徑不對。

2. 如果沒有配置代理: Vue 開發伺服器 (8080) 嘗試在自己的檔案系統中尋找一個名為 /api/users 的靜態檔案,肯定會找不到。


解決步驟


根據您使用的前端開發工具 Vite 檢查以下步驟:



1. 檢查代理配置是否正確

    確認您是否正確配置了 vite.config.js。 特別是 目標伺服器 和 路徑重寫 正確。


關鍵說明: 檢查您的後端 API 伺服器(8088) 接受的路徑是 /api/users 還是 /users?

    1.如果後端接受路徑是 /users,則 rewrite,移除 /api 前綴這行是必要的。

    2.如果後端接受路徑是 /api/users,請移除 rewrite 這行。


以我們的例子來講,後端 Spring boot API 路徑  /api/users,則不需要 rewrite。


SpringBoot-Backend


@RestController

@RequestMapping("/api")

public class UserController {


    @Autowired

    private UserRepository userRepository;


    @GetMapping("/users")

    public List<User> fetchUsers(){

        return userRepository.findAll();

    }

}



[Vue-Frontend]


UserServce.ts

import axios from 'axios'; //引入 Axios 庫


class UserService {


    getUsers() {

        return axios.get('/api/users'); //發送 GET 請求以獲取用戶列表

    }

}

export default new UserService();



vite.config.js

修正後

import { defineConfig } from 'vite'

import vue from '@vitejs/plugin-vue'

import vueDevTools from 'vite-plugin-vue-devtools'


// https://vite.dev/config/

export default defineConfig(({ mode }) => {


  return {

    plugins: [vue(), vueDevTools()],

    server: {

      proxy: {

        '/api': {

          target: http://localhost:8088, //  確保 您的後端伺服器位址

          changeOrigin: true,

          //rewrite: (path) => path.replace(/^\/api/, '') // 刪除 移除 /api 前綴

        }

      }

    }

  }

})



2. 確認代理配置後是否重啟伺服器

    vite.config.js,修改配置後,您都必須重新啟動前端開發伺服器 npm run dev,配置才會生效



3. 檢查後端伺服器狀態

    確保您的 後端 API 伺服器 (http://localhost:8088) 已經啟動並且正常運行。 

    您可以直接在瀏覽器中輸入 http://localhost:8088/api/users (或後端實際路徑) 來測試 API 是否能夠獨立存取。



4. 檢查前端 Axios 請求是否使用相對路徑

    確認您的 Vue 代碼中使用的是相對路徑:

    axios.get('/api/users') // 正確使用代理路徑



總結:

404 Not Found 錯誤最可能的原因是:

1.Proxy 配置錯誤或未生效 (忘記重啟前端伺服器)。

2.Proxy 成功轉發,但轉發到的路徑與後端 API 實際定義的路徑不匹配 (例如,rewrite 的問題)。

3.後端 API 伺服器(8088)根本沒有啟動,或該路徑在後端本身就不存在。   

留言

這個網誌中的熱門文章

初探 Vue 呼叫 API 出現 CORS 跨來源資源共享 問題原因

提要:   在 {初探Vue 與 Spring boot 的對話} 專案 ,前端 Vue 應用程式 串接 後端 API 伺服器 ,axios 呼叫 API 時出現以下,”無法取得回應內容 (No 'Access-Control-Allow-Origin' header is present on the requested resource):” 錯誤訊息,根據查找相關資料 ,出現以下原因。 瀏覽器開發工具 錯誤訊息 畫面 錯誤原因: “ Access to XMLHttpRequest at ” from origin ‘http://localhost:8080’ has been blocked by CORS policy: No ‘Access-Control-Allow-Origin’ header is present on the requested resource” 瀏覽器為了安全考量,實施了同源政策。 當您的前端應用程式 (http://localhost:8080) 嘗試呼叫一個不同來源 (不同協議、不同域名或不同埠號) 的 API 伺服器 (http://localhost:8088) 時,瀏覽器會主動阻止這個請求,除非伺服器明確地允許這個跨來源的存取。 同源政策限制(Same-Origin Policy): 同源政策限制了程式碼和不同網域資源間的互動,同源是指兩份網頁具備相同協定、埠號(如果有指定)以及主機位置 範例: 表列哪些 URL 與 URL http://www.example.com/api/p1 屬於同源: URL                                                   | 結果   | 原因 --------------------------------------------------------------------- http://www.example.com/api/p2     |...

初探 Vue 與 Spring boot 的對話之Frontend (Vue-Frontend)

  Front-end Vue 使用 REST API 建立 Vite 專案 可參考 { Vue 3 初探}  文章 danny@Danny-Yu projects % npm create vite@latest Need to install the following packages: create-vite@8.2.0 Ok to proceed? (y) y > npx > "create-vite" │ ◇   Project name: │   vue-frontend │ ◇   Select a framework: │   Vue │ ◇   Select a variant: │   TypeScript │ ◇   Use rolldown-vite (Experimental)?: │   No │ ◇   Install with npm and start now? │   Yes │ ◇   Scaffolding project in /Users/danny/Desktop/projects/vue-frontend... │ ◇   Installing dependencies with npm... added 47 packages, and audited 48 packages in 27s 6 packages are looking for funding   run `npm fund` for details found 0 vulnerabilities │ ◇   Starting dev server... > vue-frontend@0.0.0 dev > vite   VITE v7.2.4   ready in 411 ms   ➜   Local:   http://localhost:5173/   ➜   Network: use --host to expose   ➜   press h + enter to show...

初探 Spring 中的循環依賴

原因: 當兩個或多個 bean 直接或間接地相互依賴時, 就會出現 Circular Dependency (循環依賴) 如: Bean A -> Bean B -> Bean A import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; @Component public class BeanA {          @Autowired     private BeanB beanB;     public String sayHi() {         return "Hi! 我是 Class A.";     } } import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; @Component public class BeanB {          @Autowired     private BeanA beanA;     public String sayHi() {         return "Hi! 我是 Class B.";     } } 編譯時不會出現問題 danny@Danny-Yu demo % mvn clean install -Dmaven.test.skip=true                           ... ... [INFO] Installing /Users/danny/Desktop/projects/demo/target/dem...