解決.env.production 寫死 IP 的問題:Vue + config.json 運行時加載方案

背景:前端常用 .env.production 在構建時寫死 API 地址
場景:運維部署時經常不知道目標主機 IP/域名
問題:每次 IP 變動都要重新編譯 → 增加運維成本
引出需求:只修改 IP 就能完成部署,不需要重新打包

目錄

  • 一、解決方案思路
  • 二、實現步驟
  • 三、打包部署
  • 四、知識補充

一、解決方案思路

1、前端層面

  • 把動態配置從 .env.production 抽離,放到 public/config.json
  • 在應用啟動時 fetch 該文件 → 寫入 window.__APP _ CONFIG __
  • 業務代碼改用 window.__APP _ CONFIG __ 或封裝好的 axios 實例獲取 baseURL

2、后端層面(Spring Boot)

  • Spring Security 默認攔截所有請求,導致 /config.json 也被保護 → 返回 401
  • 在 security 配置中將 /config.json 加入 permitAll 白名單,確保前端靜態資源匿名可訪問

二、實現步驟

  1. 新建 public/config.json(存放運行時配置)
{"ENV": "production","VUE_APP_BASE_API": "","VUE_APP_GPU_BASE_URL": "http://10.143.135.91:9001","VUE_APP_AUTO_LOGIN_USER": "admin","VUE_APP_AUTO_LOGIN_PWD": "21232f297a57a5a743894a0e4a801fc3"
}

在這里插入圖片描述

  1. 修改 main.js → 應用啟動前加載 config.json

在 src/bootstrapConfig.ts 中封裝 loadRuntimeConfig
? Vue 3(Vite 或 Vue CLI)
src/bootstrapConfig.ts(JS 項目就用 .js)

export type AppConfig = {ENV: stringVUE_APP_BASE_API: stringVUE_APP_GPU_BASE_URL: stringVUE_APP_AUTO_LOGIN_USER: stringVUE_APP_AUTO_LOGIN_PWD: string
}export async function loadRuntimeConfig(): Promise<AppConfig> {const res = await fetch('./config.json', { cache: 'no-store' })if (!res.ok) throw new Error(`load config.json failed: ${res.status}`)const cfg = (await res.json()) as AppConfig;(window as any).__APP_CONFIG__ = cfgreturn cfg
}
export function getConfig(): AppConfig {return (window as any).__APP_CONFIG__ as AppConfig
}

src/main.ts

import { createApp } from 'vue'
import App from './App.vue'
import { loadRuntimeConfig } from './bootstrapConfig'async function bootstrap() {await loadRuntimeConfig()createApp(App).mount('#app')
}
bootstrap()

? Vue 2(Vue CLI)

src/bootstrapConfig.js

export async function loadRuntimeConfig() {const res = await fetch('./config.json', { cache: 'no-store' })if (!res.ok) throw new Error('load config.json failed: ' + res.status)window.__APP_CONFIG__ = await res.json()
}
export function getConfig() { return window.__APP_CONFIG__ }

src/main.js

import Vue from 'vue'
import App from './App.vue'
import { loadRuntimeConfig } from './bootstrapConfig'async function bootstrap() {await loadRuntimeConfig()new Vue({ render: h => h(App) }).$mount('#app')
}
bootstrap()
  1. axios 封裝:統一讀取 ‘__APP_CONFIG __’ 作為 baseURL

src/api/http.ts

import axios from 'axios'const api = axios.create({baseURL: (window as any).__APP_CONFIG__.VUE_APP_BASE_API
})export default api

業務里:

import api from '@/api/http'
// api.get('/xxx')

另一種方式
使用${window.__APP_CONFIG __.VUE_APP_GPU_BASE_URL}
在這里插入圖片描述

  1. Spring Security 配置修改:放行 /config.json
public class WebSecurityConfig extends WebSecurityConfigurerAdapter   {........@Overrideprotected void configure(HttpSecurity http) throws Exception {List<String> defaultExcludes = new ArrayList<>();defaultExcludes.add("/");defaultExcludes.add("/#/**");defaultExcludes.add("/static/**");defaultExcludes.add("/swagger-ui.html");defaultExcludes.add("/swagger-ui/**");defaultExcludes.add("/swagger-resources/**");defaultExcludes.add("/doc.html");defaultExcludes.add("/doc.html#/**");defaultExcludes.add("/v3/api-docs/**");defaultExcludes.add("/index.html");defaultExcludes.add("/webjars/**");defaultExcludes.add("/js/**");defaultExcludes.add("/api/device/query/snap/**");defaultExcludes.add("/record_proxy/*/**");defaultExcludes.add("/api/emit");defaultExcludes.add("/favicon.ico");defaultExcludes.add("/api/user/login");defaultExcludes.add("/index/hook/**");defaultExcludes.add("/api/device/query/snap/**");defaultExcludes.add("/index/hook/abl/**");// 👇 新增這一行,允許匿名訪問 config.jsondefaultExcludes.add("/config.json");

部署到Spring Boot → 驗證只改 config.json 就能適配 IP
在這里插入圖片描述
注意:改造后的文件結構

  1. .env.production (最小化)
# just a flag
NODE_ENV=production
VUE_APP_BUILD_VERSION=1.0.0

?? 注意:
VUE_APP_BASE_API、GPU_BASE_URL、賬號密碼這些 刪掉,因為它們要 runtime 配置,不要在這里寫。
可以額外放一些編譯時常量(例如版本號、構建時間)。

三、打包部署

方案一
在yml文件下添加配置規則,能夠讀取容器內的文件

spring:web:resources:static-locations: file:/app/static/,classpath:/static/

方案二
在Dockerfile配置文件

ENTRYPOINT ["java", \"-Dspring.web.resources.static-locations=file:/app/static/,classpath:/static/", \"-Dspring.resources.static-locations=file:/app/static/,classpath:/static/", \"-jar","wvp.jar", \"--spring.config.location=/app/config/"]

在這里插入圖片描述

👉 -Dspring.resources.static-locations 是 Spring Boot 2.3 及之前的老配置項,
👉 -Dspring.web.resources.static-locations 是 Spring Boot 2.4 及之后的新配置項,作用完全相同,只是命名空間不同。

意思是:

  1. 覆蓋默認規則(自己指定順序)。
  2. 讓 Spring Boot 在兩個地方找靜態資源:
    file:/app/static/ → 容器里的目錄(來自宿主機掛載的 /app/static)。
    classpath:/static/ → 打包在 jar 里的 resources/static/。

👉 關鍵點是:順序有優先級,Spring Boot 會先從 file:/app/static/ 找,如果找不到,再去 classpath:/static/。

掛載文件(先copy一份到宿主機 然后掛載到容器內部/app/static/)
在這里插入圖片描述
然后就會首先讀取容器里面的IP
在這里插入圖片描述
修改之后重啟容器

docker compose up -d --force-recreate

四、知識補充

Spring Boot 靜態資源路徑設置
如果你不寫任何配置,Spring Boot 會自動從以下目錄里找靜態文件(按順序):

  • classpath:/META-INF/resources/
  • classpath:/resources/
  • classpath:/static/ ? 最常見(即你項目里的 src/main/resources/static)
  • classpath:/public/

舉個例子:
你把 src/main/resources/static/config.json 打包進 jar → 瀏覽器訪問 http://localhost:8080/config.json 就能拿到。
這是因為 classpath:/static/ 在默認搜索路徑里。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/94808.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/94808.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/94808.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

如何從三星手機轉移到另一部三星手機

三星Galaxy S系列因其出色的設計、令人驚嘆的顯示屏、驚艷的攝像頭、更好的揚聲器以及創新的指紋傳感器而受到大多數用戶的歡迎&#xff0c;獲得了良好的聲譽。讓用戶感到滿意的是&#xff0c;三星Galaxy S10擁有更美觀的設計、令人驚嘆的顯示屏、令人驚嘆的攝像頭、更好的揚聲…

聚焦建筑能源革新!安科瑞 “光儲直柔” 方案護航碳中和目標實現

1、背景在 “雙碳” 目標引領下&#xff0c;能源結構轉型與建筑能效提升成為重要課題。清華大學江億院士提出的 “光儲直柔” 新型配電系統&#xff0c;為建筑領域綠色發展提供了創新方向。光儲直柔得到了業界廣泛認同和積極響應&#xff0c;國家、各部委、地區陸續出臺相關政策…

Shell 中 ()、(())、[]、{} 的用法詳解

文章目錄Shell 中 ()、(())、[]、{} 的用法詳解一、先明確&#xff1a;四類符號的核心功能定位二、逐個拆解&#xff1a;用法、示例與避坑點1. ()&#xff1a;子 Shell 執行&#xff0c;隔離環境核心用法1&#xff1a;子 Shell 執行命令&#xff0c;隔離變量核心用法2&#xff…

開發避坑指南(41):Vue3 提示框proxy.$modal.msgSuccess()提示文本換行解決方案

需求 由于接口返回的提示信息過長&#xff0c;接口已經在返回提示中加入換行標簽了&#xff0c;但是使用proxy.modal.msgSuccess(res.msg)提示沒有換行&#xff0c;那么Vue3中proxy.modal.msgSuccess(res.msg)提示沒有換行&#xff0c;那么Vue3 中 proxy.modal.msgSuccess(res.…

[Sync_ai_vid] 唇形同步推理流程 | Whisper架構

鏈接&#xff1a;https://github.com/bytedance/LatentSync/blob/main/docs/syncnet_arch.md docs&#xff1a;LatentSync LatentSync是一個端到端唇語同步項目&#xff0c;能夠生成語音與唇形完美匹配的逼真視頻。 該項目通過使用*音頻條件化3D U-Net*&#xff08;一種生成式…

uniapp中 ios端 scroll-view 組件內部子元素z-index失效問題

發現子組件中的彈窗在ios手機上會被限制在scroll-view里面&#xff0c;安卓手機上不受限制&#xff0c;網上找了好久原因 scroll-view組件內部設置了 -webkit-overflow-scrolling: touch 樣式&#xff0c;導致z-index失效&#xff08;safari 3D變換會忽略z-index的層級問題&…

PyTorch圖像預處理完全指南:從基礎操作到GPU加速實戰

引言 圖像預處理是模型性能的"隱形基石"&#xff0c;在計算機視覺任務中直接決定模型能否提取有效特征。科學的預處理流程能讓基礎模型性能提升15%以上&#xff0c;而GPU加速預處理可使數據準備階段耗時降低60%以上。本文將聚焦PyTorch預處理核心技術&#xff0c;從基…

【前端教程】 CSS浮動布局解析與優化:從基礎實現到工程化改進

浮動(float)是CSS中實現頁面布局的經典技術,雖然現代布局更多使用Flexbox和Grid,但理解浮動的工作原理仍是前端開發者的基礎素養。本文以一個三欄浮動布局的代碼為例,從布局原理解析、潛在問題診斷、工程化優化三個維度,帶你深入理解浮動布局的精髓與優化思路。 一、原代…

DVWA靶場通關筆記-暴力破解(Impossible級別)

目錄 一、查看源碼 二、功能分析 三、SQL注入分析 1、使用PDO預處理語句和參數綁定 2、mysqli_real_escape_string轉義 3、stripslashes去除反斜杠 四、暴力破解分析 1、token防止暴力破解機制 2、登錄失敗隨機延遲機制 3、登陸失敗報錯信息相同 4、登陸失敗的賬戶…

IAR工程如何生成compile_commands.json文件(能生成但是clangd不能生成“.cache文件”)

最近一直在使用vscodeclangd的方式編寫代碼&#xff0c;感覺使用clangd查找函數調用、函數聲明、類型定義等等都比使用vscode自帶的c/c插件好用太多了。現在我有一個功能是IAR版本的&#xff0c;那么有沒有辦法生成clangd使用的compile_commands.json文件呢&#xff1f;答案是&…

QT5.14.2、CMake 擴展openCV

一、準備工具Qt5.14.2c11cmake3.24.0opencv3.4.16二、使用cmake可擴展opencv 首先解壓cmake、opencv 兩個下載的壓縮包&#xff0c;如下&#xff1a;運行cmake-gui.exe打開后有彈窗選擇&#xff0c;然后進入QT的安裝路徑下找 mingw73_64文件下的 C和C的執行文件這個截圖是我擴展…

【3D入門-指標篇下】 3D重建評估指標對比-附實現代碼

3D重建評估指標對比表 每個指標的具體代碼位于文章末尾指標計算方法數值范圍評估重點優缺點適用場景Chamfer Distance (C1)從預測網格到真實網格的平均距離[0, ∞)幾何形狀準確性優點&#xff1a;直觀、計算高效缺點&#xff1a;對噪聲敏感整體形狀評估Chamfer Distance (C2)從…

香港電訊創新解決方案,開啟企業數字化轉型新篇章

在數字化浪潮席卷全球的今天&#xff0c;企業正加速突破傳統辦公和業務模式的桎梏&#xff0c;力求通過高效協同與業務創新實現跨越式發展。香港電訊作為科技解決方案提供商&#xff0c;持續推動技術創新應用。近期&#xff0c;香港電訊通過多項創新應用、產品升級及戰略合作&a…

數據分析編程第六步:大數據運算

6.1 數據介紹直接打開集算器運行 createEventsAndUsers.splx 文件&#xff0c;就可以得到如下兩張表&#xff08;也可以根據代碼中的注釋&#xff0c;修改起止日期以及每天的數據量&#xff09;&#xff1a;電商數據表 events.csv字段名含義eventID事件編號, 從 1 開始流水號us…

vue2+elementui 表格單元格增加背景色,根據每列數據的大小 顏色依次變淺顯示2

注意&#xff1a; 正數前5和負數后5的顏色是固定的&#xff0c;剩下5之后的數據顏色是根據第5個顏色依次變淺的&#xff1b; 封裝的js方法&#xff1a; /*** 最終版表格顏色處理器* param {Array} data 完整表格數據* param {String} field 當前字段名* param {Object} row 當前…

【AOSP】Android Dump 開發與調試指南

在 Android 系統開發與調試中&#xff0c;dump 是一個不可或缺的強大工具。它能夠提供關于系統服務、應用程序狀態以及底層硬件信息的詳細快照。對于希望深入了解 Android 系統內部工作原理、排查復雜問題或進行性能優化的開發者來說&#xff0c;掌握 dump 的使用至關重要。一、…

Qt數據結構與編碼技巧全解析

文章目錄Qt中的數據結構QDebugqDebug函數QT的內置類型一般都會重載 << 運算符QT的幾何規則QString 字符串編碼變長 VS 定長QString 適合中轉數據嗎&#xff1f;Qstring 的底層使用寫時復制QString的具體使用QString 的構造函數格式化構造數值轉化為字符串字符串轉成數值增…

Ubuntu操作系統下MySQL、MongoDB、Redis

在開發和運維過程中&#xff0c;經常需要從Windows客戶端遠程連接到Ubuntu服務器上的數據庫。本文將詳細介紹如何在Ubuntu操作系統下安裝和配置MySQL、MongoDB和Redis&#xff0c;以允許從Windows客戶端進行遠程連接&#xff0c;并提供詳細的遠程連接命令和配置說明。一、MySQL…

校園勤工儉學微信小程序的設計與實現:基于數字化服務生態的賦能體系構建

在高等教育普及化與數字化校園建設的雙重驅動下&#xff0c;傳統校園勤工儉學管理模式正面臨深刻變革。當前高校勤工儉學工作普遍存在崗位匹配效率低下、過程管理粗放、數據孤島嚴重等痛點——根據教育部全國學生資助管理中心2022年統計數據&#xff0c;全國普通高校共有約450萬…

Apisix工作流程

是的,你的理解基本正確:當請求到達APISIX時,它會先根據請求的URI、Host、請求方法、 headers等信息匹配最合適的路由,然后執行路由關聯的插件邏輯,最后轉發到路由配置的上游服務。下面詳細講解APISIX處理請求的全鏈路及可能的情況。 一、請求全鏈路流程 APISIX處理請求的…