利用SpringBoot自带的Tomcat为前端提供Web服务

409 阅读1分钟

在业务中,碰到某些应用需要频繁更新和部署,但是客户完全不会操作(连替换文件找个目录都费劲的那种)。所以在前后端分离的架构中,用SpringBoot自带Tomcat的Tomcat作为前端打包好的代码的Web服务器,并提供伪静态的支持。

前端配置

  1. 先确定好前端的路径,假设为admin。

  2. 修改.env.production中根目录的设置

VITE_BASE_URL='/admin/'
  1. 需要注意,在根目录不为/时,需要配置vue-router的根目录
history: createWebHistory(import.meta.env.VITE_BASE_URL),
  1. 运行 npm run build 打包

后端配置

后端伪静态采用urlrewritefilter实现,项目地址:github.com/paultuckey/…

  1. 添加依赖
<!-- https://mvnrepository.com/artifact/org.tuckey/urlrewritefilter -->  
<dependency>  
    <groupId>org.tuckey</groupId>  
    <artifactId>urlrewritefilter</artifactId>  
    <version>4.0.4</version>
</dependency>
  1. 在resources目录下新建admin目录,放入打包好的文件

  2. 配置资源映射

import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

@Configuration  
public class WebMvcConfig implements WebMvcConfigurer {  
   
    @Override  
    public void addResourceHandlers(ResourceHandlerRegistry registry) {  
        registry.addResourceHandler("/admin/**").addResourceLocations("classpath:/admin/");  
    }  
  
}
  1. 在resources目录下,新增伪静态配置文件urlrewrite.xml

(?!.*\.(.*)$)的含义是不包含带.的文件,防止js和css等静态资源文件重定向,可以根据需求更改

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE urlrewrite PUBLIC "-//tuckey.org//DTD UrlRewrite 3.2//EN"
        "http://tuckey.org/res/dtds/urlrewrite3.2.dtd">
<urlrewrite>
    <rule>
        <from>^/admin/(?!.*\.(.*)$).*$</from>
        <to>/admin/index.html</to>
    </rule>
</urlrewrite>
  1. 新建url重写配置类
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.io.Resource;
import org.tuckey.web.filters.urlrewrite.Conf;
import org.tuckey.web.filters.urlrewrite.UrlRewriteFilter;

import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import java.io.IOException;

@Configuration
public class UrlRewriteConf extends UrlRewriteFilter {
    private static final String URL_REWRITE = "classpath:/urlrewrite.xml";

    //注入urlrewrite配置文件
    @Value(URL_REWRITE)
    private Resource resource;

    //重写配置文件加载方式
    protected void loadUrlRewriter(FilterConfig filterConfig) throws ServletException {
        try {
            //将Resource对象转换成Conf对象
            Conf conf = new Conf(filterConfig.getServletContext(), resource.getInputStream(), resource.getFilename(), "@@traceability@@");
            checkConf(conf);
        } catch (IOException ex) {
            throw new ServletException("Unable to load URL rewrite configuration file from " + URL_REWRITE, ex);
        }
    }
}

大功告成,现在,启动项目,输入http://localhost:[port]/admin/ 就可以正常访问了。