Spring Boot整合Vue,解决静态资源映射,页面刷新失效,路径配置等问题

本文围绕Spring Boot和Vue整合开发展开。开发时前后端分离测试基本没问题,但合并部署会因后端拦截器出现静态资源访问、路径匹配等问题。文中介绍了准备工作,详细描述问题并给出解决方法,如静态资源访问配置、设置首页、处理页面刷新失效等,还提及其他处理方式和相关问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本博文属于本人原创,请尊重本人的劳动成果,如需转载,请标明出处并附上原文链接,谢谢。如有错误,欢迎指正。

前言

        为了完成学校的课程设计,我使用了Spring Boot和Vue尝试进行开发并且完成了,由于前后端分离进行开发的,所以开发时Vue使用 npm run server 就能使用浏览器进行测试,Spring Boot则在eclipse上运行后使用 PostMan 进行测试,如果是开发完之后分开部署话,基本没什么问题。
        但是,如果要将其合在一起的话,由于我们后端中一般会设置登录拦截器等,它会拦截我们的访问路径,所以需要解决静态资源访问,路径匹配等问题。我经过测试之后,在这里总结一下这些问题的解决方法,供大家参考。

关于Vue中图片打包的问题(可跳过)

        在对整合过程中出现的问题的解决方法进行正式的讲解之前,先对Vue中图片打包的问题进行一下说明,如果你是使用Vue脚手架工具 Vue CLI 创建项目并进行开发的,那难免需要在页面中嵌入图片,如果我们将图片放在一个src下的一个文件夹中,并且使用了相对路径来显示,比如这样

loading: './assets/loading.gif'

开发过程中并且在图片比较少,而且图片固定的情况,一般不会出现什么问题。但是打包完成之后,页面有时候会出现图片找不到或者加载不了的情况,像这样
在这里插入图片描述这是因为打包过程中图片的路径出了问题。要解决这个问题,只需要修改成这样即可

loading: require('./assets/loading.gif')

如果页面中需要包含大量的图片,并且图片路径需要从后端获取,比如以下图片这个样子,这个时候图片是不会打包在项目里面的,至于具体的解决方法,我放在后面讲解
在这里插入图片描述

准备工作

首先,我们只需要做初步的一个准备工作,其实准备工作挺简单的,在Vue项目所在目录下,使用cmd运行 npm run build 即可在项目下得到dist文件夹,像这样
在这里插入图片描述
我们只需要把dist文件夹下的所有内容拷贝到Spring Boot项目下的这个目录 /src/main/resources/static 下面即可。准备工作就算是完成了。
在这里插入图片描述

问题描述

在解决问题之前,我们需要先弄清楚我们的问题是什么。

1. Vue的编译好之后的文件是什么?

Vue是用来做单页面应用的,我们最后得到的只有一个html文件,即index.html。当然,我们在实际开发的过程中也会使用 多个页面组件+vue-router 来实现多个页面的效果,但它实质上是通过js来操作DOM,来改变我们的页面。所以,当我们在首页通过导航栏转向其他的页面时,实际上发生的动作是,浏览器直接向服务器发起请求,类似这样子 “/js/…js”,/css/…css,/img/…img,获取到所需要的js文件后,通过操作DOM改变页面。

2. 开发中,Vue使用一套路径,SpringBoot使用一套路径,那么我最后使用的是哪一套?

在浏览器上显示出来的当然是Vue中的那一套路径啦。SpringBoot中的那一套路径用来给前端调用以获取数据。
说实话,我也是第一次做。由于我做的东西比较简单,所以我的思路是这样子的,我后端只通过接口提供数据,并且只有首页一个html文件,前后端只进行纯数据的交互。
后端接收到请求后,只要它有权限并且参数也正确等,OK,我把JSON格式的数据给你。前端通过vue-router实现了页面跳转,在第一点已经讲过,vue实现的页面跳转实际上是获取js文件后通过DOM改变页面。它通过后端提供的接口获取数据后就可以把数据渲染到页面上。当然,vue-router中也要实现一个拦截器,不然的话,是可以通过修改浏览器地址栏的路径,不用登录和具备相应的权限即可访问到目标页面和数据。

3. 我能不能直接访问到项目中的静态资源?

不能,后端配置了拦截器拦截所有的路径之后,我们是无法直接访问到静态资源的(没有配置就可以)会出现类似这种问题
在这里插入图片描述在我们开发的过程一般都会有这样子的要求,比如我想直接通过图片路径访问图片或者访问js文件或者css文件。但是我们的后端没有这样的路径,它会提示No Mapping for /img/…img之类的或者是直接被后端的拦截器拦截掉,这个时候我们就需要这个时候我们就需要做静态资源映射了。我们把请求路径直接映射到存放静态资源的目录下,并且忽略掉对静态资源请求路径的拦截
Spring Boot 默认为我们提供了静态资源处理,提供的静态资源映射如下:

  • classpath:/META-INF/resources
  • classpath:/resources
  • classpath:/static
  • classpath:/public

那我们需要做的就是在拦截器里忽略掉这些请求路径就可以了

4. 无法直接访问页面或者刷新之后页面就丢失了

某些页面不用登录也能访问,我希望直接用网址就能访问到,如果后端不做处理,是访问不到的,因为后端不存在这样的路径。如果页面刷新之后页面丢失也是这个原因。浏览器其中输入的网址实际上是Vue管理的,那怎么解决呢?因为Vue编译打包之后路径跳转和处理逻辑都在index.html中,所以当我们访问的页面找不到时,我们需要转到index.html页面。
在SpringBoot中做的一个具体的处理就是设置ErrorPage为index.html,跳转到index.html之后,我们的请求又会被处理成/js/…js,/css/…css之类的请求直接就去请求静态资源了并且会通过后端提供的接口获取相应的数据。问题就能解决了。

解决方法

在Spring Boot2.0+中,我们可以通过实现WebMvcConfigurer接口来自己的配置类,切记不能加上@EnableWebMvc注解,接下来我们只需要重写接口里面的方法来实现我们自己的配置就可以了。

/**
 * @author godelgnis
 * @version v1.0
 * @date 2019/3/10
 */
@Configuration
//@EnableWebMvc,不能加这个注解,它会使Spring Boot为我们提供的默认配置失效
public class CorsConfig implements WebMvcConfigurer {
}

1. 静态资源访问

如果我们的后端有需要存放用户上传的多张图片,那么我们最好是把用户上传的图片放在一个固定的文件夹,如果项目最后打包成了war包,那可以选择放在static下面,如果是打包从jar包,那么建议把存放图片的文件夹设置在项目之外,不然的随着上传图片的增多,jar包会越来越大,并且不方便管理。
如果是图片放在项目里面,那么直接使用SpringBoot的默认的资源映射,如果是放在项目外,则需要在我们自己的配置类里重写addResourceHandlers方法

 @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
 		//将图片访问路径映射到D盘
        registry.addResourceHandler("/temp/img/**").addResourceLocations("file:D:/temp/img/");
//以下的写法表示将“/img/img/img/**”映射到项目里面resource.static.img,这只是个示例,相信你能够理解
//        registry.addResourceHandler("/img/img/img/**").addResourceLocations("classpath:/static/img/**");
    }

由于我写了登录拦截器,并且拦截了所有的请求,那么我就需要在拦截器里把静态资源的请求过滤掉

@Override
	public void addInterceptors(InterceptorRegistry registry) {
		registry.addInterceptor(loginInterceptor).addPathPatterns("/**").excludePathPatterns(
					"/temp/img/**",	//访问用户上传的图片的途径
					"/index.html",	//Spring Boot默认使用http://localhost:端口号就能够访问到/index.html,所以要把它忽略掉
					"/js/**",		//忽略掉js请求
					"/img/**",		//忽略掉img请求,这里放的是页面需要使用到的固定的图片,像什么error.png,loading.gif之类的
					"/css/**",		//忽略掉css请求
					"/fonts/**",	//忽略掉fonts请求
					//以下需要根据个人的实际情况来写
					//忽略掉项目中不需要登录也能访问的接口...
					"/product/get/**",
					//以下忽略掉的是Vue中路径,即不用登录就能访问到的页面组件
					"/login",
					"/register",
					"/logout",
					"/home"
					//...其他需要忽略掉的请求路径
				);
	}

通过以上配置,你就可以了访问到index.html页面了。图片也能直接访问了
在这里插入图片描述

2. 设置Spring Boot首页

如果你的首页名不是index.html,那么你也可以只设置你自己的首页

	/**
     * SpringBoot设置首页
     */
    @Override
    public void addViewControllers(ViewControllerRegistry registry) {
        WebMvcConfigurer.super.addViewControllers(registry);
        //前一个是请求路径,后一个是首页名
        registry.addViewController("/").setViewName("index");
        registry.setOrder(Ordered.HIGHEST_PRECEDENCE);
    }

3. 解决页面刷新失效及错误页设置

在第一点中我们已经解决了静态资源访问的问题了,但是我们刷新页面的时候页面就不行了,或者直接访问那些不用登录也能够访问的页面,会发现还是访问不了,不是已经忽略掉了吗?是的,已经忽略掉了,但是刷新或者直接访问页面的那些路径在后端里并不存在,所以这个时候就属于会出现404错误,Spring Boot会默认会转向/error处理
在这里插入图片描述
那么,这个时候我们就需要设置我们的错误页处理了,我们直接把错误页处理设置成我们的首页就可以了(Vue页面跳转是通过js操作DOM来实现的,这点很重要)

@Configuration
public class ServletConfig {
	@Bean
	public WebServerFactoryCustomizer<ConfigurableWebServerFactory> webServerFactoryCustomizer(){
		return factory -> {
	           ErrorPage error404Page = new ErrorPage(HttpStatus.NOT_FOUND, "/index.html");
	           factory.addErrorPages(error404Page);
		};
	}
}

经过这一个处理,,我们现在所有的页面刷新之后也不会有问题了。

另外的处理方式

https://www.cnblogs.com/SamWeb/p/8762098.html
这篇文章提到了可以使Vue在请求静态资源时加上/static/前缀,那么我们就可以在静态资源映射那里直接将/static/**映射到/static/下,然后拦截器就只需要忽略掉/static/ * *就可以了。不过这种方式我没有验证过

其他问题

也许你开发过程中会出现这样子一个问题,就是在Vue中使用了axios进行请求,比如登录操作,但是发现每次登录Spring Boot都会给我们分配一个不同sessionId,正常来说,它应该是能记住我们的登录状态的,之所以没记住我们的登录状态,是因为axios,再次请求时没有使用后端返回给我们的cookie(即sessionId),也就是说再次请求时,请求中并没有带上sessionId,所以后端就认为这是一个未登录的用户或者是新用户,然后就会重新分配一个新的sessionId。要解决这个问题,需要在Vue中这么设置

import axios from 'axios';
axios.defaults.withCredentials=true;

SpringBoot - SpringMVC的默认配置与修改

更多内容,请参考http://www.voidcn.com/article/p-hlrartsj-brp.html

好的,用户想创建一个Spring BootVue 3的项目,但没有任何编码经验。我需要先理解他们的需求,然后分步骤指导。首先,可能需要解释前后端分离的基本概念,然后分别介绍如何搭建Spring Boot后端和Vue 3前端,最后如何将它们整合。 用户没有经验,所以步骤要详细,避免使用专业术语,或者遇到术语时要解释清楚。比如,需要说明如何安装Node.js和JDK,如何使用Spring Initializr创建项目,以及Vue CLI的安装和使用。 可能需要先指导后端创建,包括依赖的选择(如Spring Web),然后创建简单的REST API。接着是前端的部分,使用Vue CLI创建项目,添加路由和axios进行HTTP请求。最后,如何将前端构建后的文件放到后端的静态资源中,或者配置代理解决跨域问题。 还要考虑常见的问题,比如跨域请求的处理,这可能需要在后端添加CORS配置,或者前端配置代理。另外,构建和部署的步骤也需要说明,比如使用Maven打包Spring Boot项目,以及Vue的npm run build。 最后,相关问题需要涵盖前后端的关键技术点,如Spring Boot的注解、Vue组件、数据交互和部署方式。确保问题能引导用户进一步学习必要的知识点。 << 好的!以下是针对零基础开发Spring Boot + Vue3项目的分步指南: --- ### **一、项目架构说明** - **前后端分离**:前端(Vue3)负责界面展示,后端(Spring Boot)处理数据逻辑 - **通信方式**:通过HTTP API(JSON格式)进行数据交互 --- ### **二、环境准备** #### 后端环境: 1. 安装JDK 17(推荐版本) ```bash # 验证安装 java -version ``` 2. 安装Maven(项目管理工具) ```bash mvn -v ``` #### 前端环境: 1. 安装Node.js(包含npm) ```bash node -v npm -v ``` 2. 安装Vue CLI ```bash npm install -g @vue/cli ``` --- ### **三、创建Spring Boot后端** 1. 访问 [start.spring.io](https://start.spring.io/) 2. 选择: - Project: Maven - Language: Java - Spring Boot: 3.x - Dependencies: Spring Web 3. 生成并下载项目 4. 创建简单API: ```java // src/main/java/com/example/demo/DemoApplication.java @SpringBootApplication @RestController public class DemoApplication { public static void main(String[] args) { SpringApplication.run(DemoApplication.class, args); } @GetMapping("/hello") public String hello() { return "Hello from Spring Boot!"; } } ``` 5. 运行应用: ```bash mvn spring-boot:run ``` 访问 http://localhost:8080/hello 验证 --- ### **四、创建Vue3前端** 1. 创建项目: ```bash vue create my-vue-app # 选择Vue3预设 ``` 2. 安装axios(HTTP客户端): ```bash cd my-vue-app npm install axios ``` 3. 修改组件: ```vue <!-- src/App.vue --> <template> <div> <h1>{{ message }}</h1> </div> </template> <script> import axios from 'axios'; export default { data() { return { message: '' } }, mounted() { axios.get('http://localhost:8080/hello') .then(response => { this.message = response.data; }) } } </script> ``` 4. 运行前端: ```bash npm run serve ``` --- ### **五、解决跨域问题** 在Spring Boot配置类中添加: ```java @Configuration public class CorsConfig implements WebMvcConfigurer { @Override public void addCorsMappings(CorsRegistry registry) { registry.addMapping("/**") .allowedOrigins("http://localhost:8081") // Vue默认端口 .allowedMethods("*"); } } ``` --- ### **六、项目结构说明** ``` project/ ├── backend/ # Spring Boot项目 └── frontend/ # Vue3项目 ``` --- ### **七、开发流程** 1. 分别启动两个服务: - 后端:`mvn spring-boot:run`(端口8080) - 前端:`npm run serve`(端口8081) 2. 开发时保持两个终端运行 --- ### **八、部署准备** 1. 构建前端: ```bash npm run build ``` 2. 将生成的dist目录内容复制到Spring Boot的`src/main/resources/static`目录 3. 打包Spring Boot应用: ```bash mvn clean package ``` 我已好以上步骤
03-22
<think>好的,用户想创建一个Spring BootVue 3的项目,但没有任何编码经验。我需要先理解他们的需求,然后分步骤指导。首先,可能需要解释前后端分离的基本概念,然后分别介绍如何搭建Spring Boot后端和Vue 3前端,最后如何将它们整合。 用户没有经验,所以步骤要详细,避免使用专业术语,或者遇到术语时要解释清楚。比如,需要说明如何安装Node.js和JDK,如何使用Spring Initializr创建项目,以及Vue CLI的安装和使用。 可能需要先指导后端创建,包括依赖的选择(如Spring Web),然后创建简单的REST API。接着是前端的部分,使用Vue CLI创建项目,添加路由和axios进行HTTP请求。最后,如何将前端构建后的文件放到后端的静态资源中,或者配置代理解决跨域问题。 还要考虑常见的问题,比如跨域请求的处理,这可能需要在后端添加CORS配置,或者前端配置代理。另外,构建和部署的步骤也需要说明,比如使用Maven打包Spring Boot项目,以及Vue的npm run build。 最后,相关问题需要涵盖前后端的关键技术点,如Spring Boot的注解、Vue组件、数据交互和部署方式。确保问题能引导用户进一步学习必要的知识点。</think><< 创建Spring BootVue 3项目的步骤如下: --- ### **分步实现说明** **1. 环境搭建** - 后端需要JDK 17和Maven:用于Java编译和依赖管理 - 前端需要Node.js和Vue CLI:用于JavaScript开发和项目脚手架 **2. 后端API开发** - 使用`@RestController`创建REST端点 - Spring Boot自动配置嵌入式Tomcat服务器 **3. 前端组件开发** - Vue的单文件组件结构(.vue文件) - 使用axios发送异步HTTP请求 **4. 跨域解决方案** - CORS配置允许特定源访问API - 开发阶段也可通过前端代理配置解决 **5. 部署整合** - 前端构建生成静态文件 - Spring Boot默认提供静态资源服务 --- ### **关键配置解释** 后端CORS配置说明: ```java // 允许来自8081端口的所有HTTP方法 .allowedMethods("*") // 实际生产环境应限制为必要方法 ``` 前端axios请求示例: ```javascript // 基础URL可配置为环境变量 axios.create({ baseURL: 'http://localhost:8080' }) ``` --- ### **常见问题处理** 1. **端口冲突**: - 修改Spring Boot的`application.properties`: ```properties server.port=9090 ``` 2. **依赖缺失**: - Maven刷新依赖:`mvn clean install -U` - NPM安装依赖:`npm install` 3. **热重载失效**: - 前端保持`npm run serve`运行 - 后端使用DevTools:`spring-boot-devtools`依赖 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值