vue打包发布在spingboot项目中 vue-router路由的处理
(原)
以下例子springboot后端地址为:localhost:7080/pingandai
vue前端地址为:locahost:8080/pingandai/
1、如果路由模式设置的是history。
那么最好带上base,(base是根目录的地址,比如你在页面上访问localhost:8080/b,那么它会自动跳转到localhost:8080/pingandai/b路径上)
打包完成后(打包过程这里不再描述,npm run build,网上很多例子),如果将dist下的文件都拷贝到springboot中resources/static目录下(比如后台的地址为localhost:7080/pingandai),此时你在URL上输入localhsot:7080/pingandai/b,你是找不到页面的,原因是它在controller中找地址,发现没有,直接就跳到错误页面了,由于前端打包后只有一个index.html页面,所以我们把请求错误重定向到index.html就可以了。
路由官网的描述在这里:
https://router.vuejs.org/zh/guide/essentials/history-mode.html#后端配置例子
我们在spring中怎么配呢?
在springboot2.0以下和springboot2.0以上的配置不一样,有些公司用的springboot2.0+的版本,但是网上给的全是
这种代码,springboot2.0以上的版本已经把EmbeddedServletContainerCustomizer给移除了,所以根本找不到,先看下官网在二个版本中不同的写法。
https://docs.spring.io/spring-boot/docs/1.5.21.BUILD-SNAPSHOT/reference/htmlsingle/#boot-features-programmatic-embedded-container-customization
https://docs.spring.io/spring-boot/docs/2.0.9.RELEASE/reference/htmlsingle/#boot-features-programmatic-embedded-container-customization
1.5.21版本代码如下:
2.0.9版本代码如下:
这里的nofount.html就是index.html页面:
这样,通过http://localhost:7080/pingandai/b就可以正常访问到页面了。
注意:如果前端的路由设置的是二级或以上的话,页面是访问不了的,就像这样:
前端访问地址为:http://localhost:7080/pingandai/a/b,控制台会报错:
原因是vue是一个单页面应用,打包后的文件index.html引用js和css的路径为其目录下的相对路径:
但是放在浏览器上,它会从url上找当前路径,就变成了去pingandai/a/static/…目录下找资源,这肯定是找不到的。js及css资源路径应该在pingandai/static/… 下。所以路由在history模式下打包后若要发布在springboot项目中,需要注意路径的地址不要出现多级。
2、 如果路由模式设置的是默认的hash
如果路由是hash模式打包放到springboot的resources/static目录下,以上history模式不能访问二级url地址的问题就不存在了。
但是它的访问路径将会变成:locahost:7080/pingandai/#/a或者locahost:7080/pingandai/#/a/b才行,由于hash模式中#后面字符是页面定位的,所以不会发送给后端(比如url上输入的是locahost:7080/pingandai/#/a/b,后端实际收到的请求地址是locahost:7080/pingandai),这里的locahost:7080/pingandai实际上是访问的index.html页面(因为找不到这个页面会跳到错误页面index.html上,前提是配置了错误页面),在这个页面上显示的内容则完全由#后面的内容控制。
但是这样会存在一个问题,如果springboot集成了shiro,那么权限过滤时必然要设置成这样filterMap.put("/**", "过滤器");过滤器如果是/anon,这会导至页面所有请求都放行,刚才的locahost:7080/pingandai/#/a和locahost:7080/pingandai/#/a/b是可以访问了,但是权限过滤不生效。如果设置成/oath(假定这里的oath是权限拦截的过滤器),那么/a和/a/b页面又出不来。
由于以上问题,所以最好不要直接打包后放到spingboot下,用单独的tomcat或nignx去部署。
vue打包发布在spingboot项目中 vue-router路由的处理的更多相关文章
- 在使用vue+webpack模版创建的项目中使用font-awesome
前言:最近使用vue+webpack进行一个小项目的开发,按照官方模版文档完成项目初始化后打算引入ont-awesome字体图标库进行使用,引入过程中遇到一些问题并解决,现记录如下. 一开始进展很顺利 ...
- 全面解析JavaScript的Backbone.js框架中的Router路由
这篇文章主要介绍了Backbone.js框架中的Router路由功能,Router在Backbone中相当于一个MVC框架中的Controller控制器功能,需要的朋友可以参考下. Backbone ...
- 《论vue在前后端分离项目中的实践之年终总结》
我是2014年的时候开始了解知道的vue,当时vue还不太成熟,想用但是又怕自己hold不住,况且那时候vue还没有成熟的(路由.验证.ui组件)插件,社区也是不温不火的,再说也没有合适的机遇让我去项 ...
- VUE打包发布后无法访问js、css资源
在vue开发中,本地测试以及测试环境中都没有遇到问题,当发布生产,有虚拟路径时,便出现js.css均报错404: 首先在config的index.js文件中,将assetsPublicPath修改为' ...
- 后端 SpringBoot + 前端 vue 打包发布到Tomcat
近段时间 做了一些前后端的开发 需要在Tomcat里进行发布 把自己整理的分享出来 后端打包 pom.xml 文件 <packaging>war</packaging> ...
- vue 项目中当访问路由不存在的时候默认访问404页面
前言: 在Vue项目中,当访问的页面路由不存在或错误时,页面显示为一片空白.然而,通常我们需要对访问url不存在或者错误的情况下添加默认的404页面,即not found页面. 一般的处理方法是: 在 ...
- mockjs 在项目中vue项目中使用
一.为什么要使用mockjs 总结起来就是在后端接口没有开发完成之前,前端可以用已有的接口文档,在真实的请求上拦截ajax,并根据mockjs的mock数据的规则,模拟真实接口返回的数据,并将随机的模 ...
- 「实践篇」解决微前端 single-spa 项目中 Vue 和 React 路由跳转问题
前言 本文介绍的是在做微前端 single-spa 项目过程中,遇到的 Vue 子应用和 React 子应用互相跳转路由时遇到的问题. 项目情况:single-spa 项目,基座用的是 React,目 ...
- vue学习面向对象,在项目中怎么用呢?
面向对象感觉很牛逼,可是在项目中怎么用呢? 我至今见到的用法,写了一个用户对象. 效果:只要执行了new User(userInfo)就会在cookie,localStorage存放数据. 所以最简单 ...
随机推荐
- SQLServer存储过程自制数据字典
相信很多小伙伴都对[数据字典]很头疼. 小编刚入职的时候,老大丢一个项目过来,就一个设计文档,数据字典木有,字段说明木有, 全部都需要靠“联系上下文”来猜.所以小伙伴门一定要养成说明字段的习惯哦. 说 ...
- python3 进一步了解装饰器 NLP第四条
还是先来抄一段NLP第四条: 四,只有感官经验塑造出来的世界,没有绝对的真实世界 每个人运用自己的感觉器官把资料摄入(摄入过程),由于感官运用是主观地有选择性的,因此不能,亦不需要把所有资料捕获. ...
- IM开发者的零基础通信技术入门(一):通信交换技术的百年发展史(上)
[来源申明]本文原文来自:微信公众号“鲜枣课堂”,官方网站:xzclass.com,原题为:<通信交换的百年沧桑(上)>,本文引用时已征得原作者同意.为了更好的内容呈现,即时通讯网在收录时 ...
- Java基础知识回顾之六 ----- IO流
前言 在上一篇文章中,回顾了Java的多线程.而在本篇文章中主要介绍Java IO的相关知识. IO的介绍 什么是IO? IO的名称又来是Input与Output的缩写,也就是输入流和输出流.输入流用 ...
- WebApiClient的接口输入验证
1. 文章目的 随着WebApiClient的不断完善,越来越多开发者选择WebApiClient替换原生的HttpClient,本文将介绍WebApiClient的接口参数输入有效性验证的新特性. ...
- Asp.Net Core 轻松学-在.Net Core 中使用钩子
前言 Host startup hook,是2.2中提供的一项新的功能,通过使用主机启动钩子,允许开发人员在不修改代码的情况下,在服务启动之前注入代码:通过使用钩子,可以对已部署好的服务在服务 ...
- RDIFramework.NET V3.3 WinForm版角色授权管理新增角色对操作权限项、模块起止生效日期的设置
在实际应用在我们可能会有这样的需求,某个操作权限项(按钮)或菜单在某个时间范围内可以让指定角色访问.此时通过我们的角色权限扩展设置就可以办到. 在我们框架V3.3 WinForm版全新增加了角色权限扩 ...
- 改行了,学C#
C#数组: 定义方法 ]; ,]; //这个是二维数组 只有这一种定义方法,不像java有多种定义方法.等号前面在栈中初始化类型为一维数组类型(int[])或二维数组类型(int[,])的存储堆中地址 ...
- .net 简单实用Log4net(多个日志配置文件)
前言: 几乎所有的大型应用都会有自己的用于跟踪调试的API.因为一旦程序被部署以后,就不太可能再利用专门的调试工具了.然而一个管理员可能需要有一套强大的日志系统来诊断和修复配置上的问题.所以这个时候就 ...
- c# Base64解密加密
private static string base64EncodeChars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz ...