vue打包到springboot项目下出现,vue页面刷新页面404错误/Whitelabel Error Page、无法直接通过路径访问Whitelabel Error Page

本文介绍了解决Vue项目与SpringBoot后端整合后,刷新页面出现404错误的方法。通过在启动类中添加自定义错误页面映射,将所有404错误重定向至index.html,由Vue接管路由。

vue打包到springboot项目下出现,vue页面刷新页面404错误/Whitelabel Error Page、无法直接通过路径访问Whitelabel Error Page

问题描述

将vue项目整合进后端项目,部署服务器后,正常使用没有问题,但是只要刷新当前页面就总是返回404错误,Whitelabel Error Page,This application has no explicit mapping for /error, so you are seeing this as a fallback。上网查看很多原因,有的说是没有配置视图解析器,有的说是application启动类放置的位置不对,有的说是controller的路径写的不对造成的。

问题原因

我理解的原因是,正常情况下我们刷新页面,那么浏览器就会按照url去后台请求数据。但是在vue项目中,url只是在router中定义的跳转路径(并不是controller中的mapping),当跳转到某页面之后会在调用api(比如说在created的时候)去后台请求数据。那么我们刷新页面, 浏览器会认为url是对应controller中的mapping,但实际上后台根本没有对应的方法,因此报错

解决办法

vue项目与后端项目整合是通过install打包前端项目,然后把打包完产生的dist文件夹下的static文件夹和index.html放到后端项目的static路径下,其实最终整个前端项目都被编译成js文件,由index.html进行渲染。因此我这里通过捕获404HTTP错误状态码自定义页面,将页面指向了index.html,由其进行解析。解决办法就是在启动类加上如下代码:

@Bean
public WebServerFactoryCustomizer<ConfigurableWebServerFactory> webServerFactoryCustomizer(){
	return factory -> {
           ErrorPage error404Page = new ErrorPage(HttpStatus.NOT_FOUND, "/index.html");
           factory.addErrorPages(error404Page);
	};
}
需要注意的是,这是SpringBoot版本在2.0以上的写法。2.0之后EmbeddedServletContainerCustomizer 类被WebServerFactoryCustomizer取代了。2.0以下的可以参考如下代码:
@Bean
public EmbeddedServletContainerCustomizer containerCustomizer() {
 
   return (container -> {
        ErrorPage error401Page = new ErrorPage(HttpStatus.UNAUTHORIZED, "/401.html");
        ErrorPage error404Page = new ErrorPage(HttpStatus.NOT_FOUND, "/404.html");
        ErrorPage error500Page = new ErrorPage(HttpStatus.INTERNAL_SERVER_ERROR, "/500.html");
 
        container.addErrorPages(error401Page, error404Page, error500Page);
   });
}

vue打包后将dist目录下的文件复制到springboot项目src/main/resources下的static目录下面(没有static就先创建一个)自定义页面需放在static目录下,默认路径为src/main/resources/static

### Vue3 项目启动时出现 Whitelabel Error Page 的解决方案 当遇到 Whitelabel Error Page 错误时,通常意味着应用程序未能成功加载或存在配置错误。以下是针对此问题的具体排查方法: #### 配置文件检查 确保 `vue.config.js` 文件中的公共路径设置正确。如果使用相对模块解析,则应将 `publicPath` 设置为空字符串[^1]: ```javascript module.exports = { publicPath: process.env.NODE_ENV === 'production' ? './' : '/' } ``` #### 路由模式调整 Vue Router 默认采用 hash 模式,但在某些情况下可能需要更改为 history 模式。为了防止服务器端找不到路由而返回 404 页面,在 vue-router 中启用 history mode 后需配合后端做相应处理: 对于 Spring Boot 应用程序而言,可以在控制器中添加如下代码来捕获所有请求并重定向到 index.html: ```java import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; @Controller public class SpaFallbackController { @RequestMapping({"/{path:[^\\.]*}", "/{path:^(?!api).*$}/**"}) public String redirect() { return "forward:/"; } } ``` #### Nginx 反向代理配置 如果是通过 Nginx 进行反向代理部署,则应在 nginx.conf 或者站点配置文件里加入 try_files 指令以支持前端路由: ```nginx location / { try_files $uri/ /index.html; } ``` 以上措施能够有效解决大部分由于前后端分离造成的页面无法正常访问的问题。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值