因为项目需求,前端有好几个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";//自定义的错误页面
}
}