vue路由history项目整合springboot 并保留原404错误处理(并支持部署多个vue history项目)

因为项目需求,前端有好几个vue项目要部署在我这,但是又不想用hash模式的#号模式,经过了几轮的搜索查找,网上有很多相关教程,但是都没有支持部署多个vue history。无奈只能自己摸索。后在参考了vuecli2.0路由history单页面模式整合springboot,打包后页面使用url访问404解决方案_vue通过url访问单个页面_逆风出击的程序猿的博客-CSDN博客 的文章。得知方法是因为vue history是单页面,所有访问相关地址会出现404,只要将404转发到vue的index.html就行了。然后我进行了一些优化,使其可以支持多个vue项目和自定义404处理。具体代码如下:


package com.laituo.schoolStu.controller.common;

import org.apache.shiro.util.AntPathMatcher;
import org.springframework.boot.web.servlet.error.ErrorController;
import org.springframework.http.HttpStatus;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@Controller
public class CustomErrorController implements ErrorController {

    private static final String ERROR_PATH = "/error";
    private static final String WEBAPP_PATTERN = "/webapp/**";//设置其中一个vue history 项目的位置
    private final AntPathMatcher pathMatcher = new AntPathMatcher();

    @RequestMapping(value = ERROR_PATH)
    public String handle404Error(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        if (response.getStatus() == HttpStatus.NOT_FOUND.value()) {//判断状态码是不是404
            String url = (String) request.getAttribute(RequestDispatcher.ERROR_REQUEST_URI);//获取请求失败的url
            if (pathMatcher.match(WEBAPP_PATTERN, url)) {//判断url 是否符合vue history项目的路径
                request.getRequestDispatcher("/webapp/index.html").forward(request, response);//如果符合则重定向到相应的位置
            }
            return null;
        }
        return "defaultErrorView";//自定义的错误页面
    }
}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Vue 由的 history 模式下,刷新页面会导致 404 错误的出现,这是因为浏览器会向服务器发送请求,但服务器并没有对应的由,因此就会返回 404 错误。解决这个问题的方法有两种: 1. 配置后端服务器 如果你的 Vue 项目部署在 Apache 或 Nginx 等 Web 服务器上,你可以配置服务器来处理这个问题。具体做法是,在服务器上配置一个重定向规则,将所有的 URL 请求都重定向到 index.html 文件上。以 Apache 服务器为例,可以在 Apache 的配置文件(如 httpd.conf)中添加以下规则: ``` <IfModule mod_rewrite.c> RewriteEngine On RewriteBase / RewriteRule ^index\.html$ - [L] RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule . /index.html [L] </IfModule> ``` 这个配置将所有的 URL 请求都重定向到 index.html 文件上,这样即使刷新页面,服务器也会返回正确的内容。 2. 使用 hash 模式 如果你不想在服务器上配置重定向规则,你可以考虑使用 hash 模式。在 hash 模式下,Vue 会使用 URL 中的 # 符号来表示由,这样即使刷新页面,浏览器也只会重新加载 index.html 文件,而不会向服务器发送请求。要启用 hash 模式,只需要在 Vue 由的配置中添加以下代码: ``` const router = new VueRouter({ mode: 'hash', routes: [...] }) ``` 这样就可以启用 hash 模式了。需要注意的是,hash 模式下,URL 中的 # 符号后面的内容不会被发送到服务器,因此你需要在前端代码中使用 JavaScript 来解析 URL 中的 hash 值,并根据这个值来渲染不同的页面。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值