日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

你不知道的SpringBoot與Vue部署解決方案

瀏覽:27日期:2022-11-04 09:07:59

前言

前段時間公司外網部署的演示環境全部轉到內網環境中去,所有對外演示的環境都需要申請外網映射才能訪問某個服務。我用一個外網地址 www.a.com 映射到一個內網地址 http://ip:port ,然后在這個地址 http://ip:port 用 nginx 做代理轉發到各個組的項目 http://ipn:portn 上去,其中也遇到一些靜態資源 404,主要是是解決這個 404 問題。

最近又做了一個項目,考慮到用戶的體驗,減少部署的復雜性,我想了一個辦法用 SpringBoot 做 web 服務器映射前端資源為 web 資源 。

條件允許或者對性能要求比較高,推薦是前后端分離部署,nginx 做 web 服務器,后端只提供接口服務

以前部署的項目 A 外網訪問地址是 http://ip1:8080 ,外網映射后只能訪問 http://ip/app1 ,以前項目 B 外網訪問地址是 http://ip1:8081 ,項目訪問地址是 http://ip/app2 。這也算是一個不大不小的變動,但是切換之后遇到的第一個問題就是靜態資源轉發導致 404 。

比如以前項目 A 訪問地址是 http://ip1:8080 它是沒有上下文的。

而現在 A 的訪問地址為 http://ip/app1 ,有一個上下文 app1 在這里,導致有一些資源 404。

比如說:原來 http://ip1:8080 請求到了 index.html 資源,現在只能 http://ip/app1 請求到 index.html。

<!-- index.html --><!-- 原來部署環境寫法 --><link href='http://m.b3g6.com/index.css' rel='external nofollow' rel='external nofollow' rel='external nofollow' rel='stylesheet'>

以前訪問 index.css 地址是 http://ip1:8080/index.css ,但是現在變成訪問了 http://ip/index.css 導致 404,實際 index.css 地址為 http://ip/app1/index.css

前端使用 vue 編寫,html 中的靜態資源路徑可以很好解決,修改 webpack 打包即可。

<!-- 原來部署環境寫法 --><link href='http://m.b3g6.com/index.css' rel='external nofollow' rel='external nofollow' rel='external nofollow' rel='stylesheet'><!-- 寫成相對路徑 --><link href='http://m.b3g6.com/bcjs/index.css' rel='external nofollow' rel='stylesheet'><!-- 結合 webpack 打包時進行路徑補充 --><link href='http://m.b3g6.com/bcjs/<%= BASE_URL %>index.css' rel='external nofollow' rel='stylesheet'>

但是項目中有一些組件的請求沒有辦法統一處理,只能改代碼。但我不想動代碼,webpack 打包都不想動,基于這些需求想了一個辦法來解決。

本文內容

Nginx 部署 vue 項目,怎么能友好處理靜態資源的丟失 SpringBoot 提供 web 服務器的功能映射 vue 項目為 web 資源,并處理 vue 路由轉發 index.html 問題。

演示代碼地址

Nginx 部署 Vue 項目

server { listen 8087; # 它的作用是不重定向地址,比如瀏覽器輸入 /app1 訪問,也可以訪問到 /app1/ ,而瀏覽器地址是不改變的 /app1 。沒辦法,強迫癥 location / { try_files $uri $uri/; } root /Users/zhangpanqin/staic/; location ~ /(.*)/ { index index.html /index.html; try_files $uri $uri/ /$1/index.html; }}

/Users/zhangpanqin/staic/ 放部署的項目,比如 app 的項目資源放到 /Users/zhangpanqin/staic/app 下。 訪問地址為 http://ip/8087/app

<!DOCTYPE html><html lang='en'><head> <!-- 也可以改成類似的地址 BASE_URL 等于 vue.config.js 配置的 publicPath--> <link rel='icon' href='http://m.b3g6.com/bcjs/<%= BASE_URL %>favicon.ico' rel='external nofollow' > <!-- 部署之后,訪問不到 index.css --> <link href='http://m.b3g6.com/index.css' rel='external nofollow' rel='external nofollow' rel='external nofollow' rel='stylesheet'></head></html>

為了可以在瀏覽器輸入 vue 的路由 /app/blog 也可以訪問頁面,需要添加 vue-router 中的 base 屬性。

import Vue from ’vue’;import VueRouter from ’vue-router’;Vue.use(VueRouter);const routes = [ { path: ’/’, name: ’Home’, component: () => import(’@/views/Home.vue’), }, { path: ’/blog’, name: ’Blog’, component: () => import(’@/views/Blog.vue’), }, { // 匹配不到路由的時候跳轉到這里 path: ’*’, name: ’Error404’, component: () => import(’@/views/Error404.vue’), }];const router = new VueRouter({ // 主要是修改這里,可以根據 vue mode 環境來取值。 // https://cli.vuejs.org/zh/guide/mode-and-env.html // https://router.vuejs.org/zh/api/#base base: process.env.VUE_APP_DEPLOY_PATH, mode: ’history’, routes,});export default router;

你不知道的SpringBoot與Vue部署解決方案

http://localhost:8087/app/index.css 為 css 的真實地址。所以想辦法為這些不以 /app 開頭的資源加上 /app 就可以了,想了想只有 cookie 能做到。

x_vue_path 記錄每個項目的路徑,然后靜態資源去這個路徑下尋找, $cookie_x_vue_path/$uri

下面這個配置使用了 try_files 內部重定向資源,是不會在瀏覽器端發生重定向的。

# gzip ,緩存 和 epoll 優化的都沒寫server { listen 8087; # 它的作用是不重定向地址,比如瀏覽器輸入 /app1 訪問,也可以訪問到 /app1/ ,而瀏覽器地址是不改變的 /app1 。沒辦法,強迫癥 location / { try_files $uri $uri/; } root /Users/zhangpanqin/staic/; # (.*) 匹配是哪個項目,比如說 app1 app2 等 location ~ /(.*)/.*/ { index index.html /index.html; add_header Set-Cookie 'x_vue_path=/$1;path=/;'; # /Users/zhangpanqin/staic/+/$1/index.html 可以到每個項目下 index.html try_files $uri $uri/ /$1/index.html @404router; } # 查找靜態資源,也可以在這里添加緩存。 location ~ (.css|js)$ { try_files $uri $cookie_x_vue_path/$uri @404router; } location @404router { return 404; }}

你不知道的SpringBoot與Vue部署解決方案

下面這個是重定向的配置

server { listen 8087; root /Users/zhangpanqin/staic/; location ~ /(.*)/.*/? { index index.html /index.html; add_header Set-Cookie 'x_vue_path=/$1;path=/;'; try_files $uri $uri/ /$1/index.html @404router; } location ~ (.css|js)$ { # 匹配到 /app/index.css 的資源,直接訪問 rewrite ^($cookie_x_vue_path)/.* $uri break; # 訪問的資源 /index.css 302 臨時重定向到 /app/index.css rewrite (.css|js)$ $cookie_x_vue_path$uri redirect; } location @404router { return 404; }}

你不知道的SpringBoot與Vue部署解決方案

根據這個思路就可以把所有的資源進行轉發了,不用改業務代碼,只需給 vue-router 加上一個 base 基礎路由。

SpringBoot 部署 Vue 項目

Nginx 走通了,SpringBoot 依葫蘆畫瓢就行了,還是 java 寫的舒服,能 debug,哈哈。

SpringBoot 映射靜態資源

@Configurationpublic class VueWebConfig implements WebMvcConfigurer { /** * 映射的靜態資源路徑 * file:./static/ 路徑是相對于 user.dir 路徑,jar 包同級目錄下的 static */ private static final String[] CLASSPATH_RESOURCE_LOCATIONS = {'file:./static/', 'classpath:/META-INF/resources/', 'classpath:/resources/', 'classpath:/static/', 'classpath:/public/'}; @Override public void addResourceHandlers(ResourceHandlerRegistry registry) { // 添加靜態資源緩存 CacheControl cacheControl = CacheControl.maxAge(5, TimeUnit.HOURS).cachePublic(); registry.addResourceHandler('/**').addResourceLocations(CLASSPATH_RESOURCE_LOCATIONS).setCacheControl(cacheControl); } @Override public void addInterceptors(InterceptorRegistry registry) { // 配置要攔截的資源,主要用于 添加 cookie registry.addInterceptor(new VueCookieInterceptor()).addPathPatterns('/test/**'); } // vue 路由轉發使用的,也做 接口請求找不到的 @Bean public VueErrorController vueErrorController() { return new VueErrorController(new DefaultErrorAttributes()); }}

項目靜態資源路徑添加 cookie

public class VueCookieInterceptor implements HandlerInterceptor { public static final String VUE_HTML_COOKIE_NAME = 'x_vue_path'; public static final String VUE_HTML_COOKIE_VALUE = '/test'; /** * 配置請求資源路徑 /test 下全部加上 cookie */ @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { final Cookie cookieByName = getCookieByName(request, VUE_HTML_COOKIE_NAME); if (Objects.isNull(cookieByName)) { final Cookie cookie = new Cookie(VUE_HTML_COOKIE_NAME, VUE_HTML_COOKIE_VALUE); // 項目下的 url 都帶能帶上 cookie.setPath('/'); cookie.setHttpOnly(true); response.addCookie(cookie); } return true; } public static Cookie getCookieByName(HttpServletRequest httpServletRequest, String cookieName) { final Cookie[] cookies = httpServletRequest.getCookies(); if (Objects.isNull(cookieName) || Objects.isNull(cookies)) { return null; } for (Cookie cookie : cookies) { final String name = cookie.getName(); if (Objects.equals(cookieName, name)) {return cookie; } } return null; }}

請求出現錯誤做資源的轉發

訪問錯誤的跳轉要分清楚 接口請求和靜態資源的請求,通過 accept 可以判斷。

@RequestMapping('/error')public class VueErrorController extends AbstractErrorController { private static final String ONLINE_SAIL = VUE_HTML_COOKIE_NAME; private static final String ERROR_BEFORE_PATH = 'javax.servlet.error.request_uri'; public VueErrorController(DefaultErrorAttributes defaultErrorAttributes) { super(defaultErrorAttributes); } @Override public String getErrorPath() { return '/error'; } @RequestMapping public ModelAndView errorHtml(HttpServletRequest httpServletRequest, HttpServletResponse response, @CookieValue(name = ONLINE_SAIL, required = false, defaultValue = '') String cookie) { final Object attribute = httpServletRequest.getAttribute(ERROR_BEFORE_PATH); if (cookie.length() > 0 && Objects.nonNull(attribute)) { response.setStatus(HttpStatus.OK.value()); String requestURI = attribute.toString(); // 訪問的路徑沒有以 vue 部署的路徑結尾,補充上路徑轉發去訪問 if (!requestURI.startsWith(cookie)) {ModelAndView modelAndView = new ModelAndView();modelAndView.setStatus(HttpStatus.OK);// 靜態資源不想轉發,重定向的話,修改為 redirectString viewName = 'forward:' + cookie + requestURI;modelAndView.setViewName(viewName);return modelAndView; } } ModelAndView modelAndView = new ModelAndView(); modelAndView.setStatus(HttpStatus.OK); modelAndView.setViewName('forward:/test/index.html'); return modelAndView; } // 處理請求頭為 accept 為 application/json 的請求,就是接口請求返回json 數據 @RequestMapping(produces = MediaType.APPLICATION_JSON_VALUE) public ResponseEntity<Map<String, Object>> error(HttpServletRequest request) { HttpStatus status = getStatus(request); if (status == HttpStatus.NO_CONTENT) { return new ResponseEntity<>(status); } final Map<String, Object> errorAttributes = getErrorAttributes(request, true); return new ResponseEntity<>(errorAttributes, status); }

首頁跳轉

@Controllerpublic class IndexController { @RequestMapping(value = {'/test', '/test'}) public String index() { return 'forward:/test/index.html'; }}

本文由 張攀欽的博客 www.mflyyou.cn/ 創作。 可自由轉載、引用,但需署名作者且注明文章出處。

到此這篇關于你不知道的SpringBoot與Vue部署解決方案的文章就介紹到這了,更多相關SpringBoot與Vue部署內容請搜索好吧啦網以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持好吧啦網!

標簽: Spring
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
日产欧产美韩系列久久99| 亚洲少妇一区| 国产一级成人av| 欧美日韩精品一本二本三本 | 亚洲欧洲国产精品一区| 少妇精品久久久一区二区三区| 国产一区二区高清| 深夜福利一区| 精品亚洲精品| 久久中文字幕av一区二区不卡| 国产视频一区欧美| 日本国产欧美| 亚洲最新无码中文字幕久久| 影音先锋国产精品| 国产日韩视频在线| 精品日韩视频| 日韩精品亚洲专区在线观看| 美女国产一区二区三区| 亚洲va在线| 免费在线观看一区二区三区| 免费观看亚洲天堂| 亚洲韩日在线| 日韩不卡在线观看日韩不卡视频| 精品九九在线| 视频在线在亚洲| 欧美激情三区| 日韩视频一区| 久久久久久久久成人| 亚洲一级二级| 国产精品久久久久久久久久久久久久久 | 天堂av在线一区| 日韩精品第一| 国产在线观看91一区二区三区| 欧美精品一线| 国产精品男女| 黑丝一区二区| 久久av偷拍| 丝瓜av网站精品一区二区| 久久精品国产999大香线蕉 | 欧美1级日本1级| 日韩激情精品| 久久在线电影| 精品国产亚洲一区二区三区在线| 9久re热视频在线精品| 精品五月天堂| 日本在线一区二区三区| 欧美亚洲国产一区| 美女毛片一区二区三区四区最新中文字幕亚洲 | 久久国产精品久久久久久电车| 日韩av网站在线免费观看| 日韩精品一卡| 精品在线网站观看| 日韩超碰人人爽人人做人人添| 亚洲福利免费| 91欧美日韩| 国产伦理一区| 日韩精品一区第一页| 99热国内精品| 高清一区二区三区| 国产图片一区| 免费观看久久久4p| 午夜欧美精品久久久久久久| 91亚洲一区| 国产精品亚洲产品| 视频一区国产视频| 亚洲高清不卡| 亚洲永久av| 精品午夜av| 国产乱人伦丫前精品视频| 另类av一区二区| 午夜免费一区| 99久久精品国产亚洲精品| 91日韩欧美| 国产一区丝袜| 精品中国亚洲| 美女性感视频久久| 国产精品视频一区二区三区综合| 亚洲精品日韩久久| 久久最新视频| 91国语精品自产拍| 天堂日韩电影| 亚洲va在线| 亚洲香蕉网站| 欧美亚洲国产激情| 欧洲一级精品| 久久在线电影| 亚洲夜间福利| 亚洲国产一区二区三区在线播放| 国产精品99一区二区| 欧美中文一区二区| 精品中文字幕一区二区三区av| 久久国产电影| 99tv成人| 亚洲午夜久久久久久尤物| 国产美女高潮在线| а√天堂中文在线资源8| 在线看片福利| 亚洲v在线看| 99国产精品久久久久久久成人热| 国产精品人人爽人人做我的可爱| 亚洲欧美日本日韩| 久久xxxx| 亚洲精品美女91| 日本不卡一二三区黄网| 奇米色欧美一区二区三区| 久久精品 人人爱| 另类小说一区二区三区| 成人精品久久| 免费成人网www| 婷婷综合网站| 久久亚洲一区| 欧美一区自拍| 国产专区精品| 激情欧美一区二区三区| av不卡在线看| 青青青国产精品| 国产伊人久久| 亚洲精品一二三区区别| 国产美女一区| 欧美日本一区| 欧美国产美女| 在线视频日韩| 国产美女撒尿一区二区| 日韩久久精品| 激情婷婷综合| 蜜桃一区二区三区在线观看| 国产日产精品_国产精品毛片 | 麻豆久久久久久| 欧美日韩亚洲一区三区| 国产调教精品| 日韩亚洲一区在线| 国产亚洲亚洲| 国产精品欧美大片| 四虎影视精品| 综合一区av| 成人午夜网址| 国产精品美女久久久| 三级在线观看一区二区| 久久女人天堂| 亚洲欧美高清| 精品久久久网| 三级欧美在线一区| 精品一区二区三区亚洲| 亚洲黄色影院| 鲁大师精品99久久久| 性欧美69xoxoxoxo| 国产精品对白久久久久粗| 女人天堂亚洲aⅴ在线观看| 国产美女亚洲精品7777| 在线视频免费在线观看一区二区| 国产精品magnet| 国产视频一区在线观看一区免费| 欧美日韩一区二区三区不卡视频 | 综合激情视频| 黑森林国产精品av| 日韩高清中文字幕一区| 美女福利一区二区三区| 欧美亚洲福利| 国产精品日本| 电影亚洲精品噜噜在线观看| 日韩av影院| 99在线观看免费视频精品观看| 精品一二三区| 欧美在线观看天堂一区二区三区| 亚洲深夜视频| 欧美激情在线精品一区二区三区| 中文不卡在线| 精品三级久久| 精品视频黄色| 国产日韩高清一区二区三区在线 | 少妇精品在线| 激情不卡一区二区三区视频在线| 五月天综合网站| 国产精品一国产精品k频道56| 91精品韩国| 免费视频一区二区| 国产美女亚洲精品7777| 韩国精品主播一区二区在线观看 | 中文一区一区三区免费在线观| 深夜福利视频一区二区| 国产日韩三级| 亚洲精品护士| 亚洲免费高清| 91精品一区国产高清在线gif| 麻豆国产91在线播放| 视频一区二区三区入口| 一本色道久久精品| 亚洲三级国产| 午夜精品亚洲| 超碰超碰人人人人精品| 国产精品亚洲四区在线观看| 99热精品在线观看| 久久婷婷av| 91综合视频| 久久久久久色| 夜夜精品视频| 午夜久久影院| 国精品一区二区三区| 老司机精品视频在线播放| 欧美一级网站|