Java Spring Boot SPA URL重写

Java Spring Boot SPA URL重写,java,spring,spring-boot,spring-mvc,Java,Spring,Spring Boot,Spring Mvc,我正在尝试构建一个SPA后端(静态内容服务器,api),其中包含一些需要灵活的URL重写/路由/处理的附加功能/控件。事实证明,这些要求很难一起实现,尽管我在这里通读了一些类似的答案,尝试了这种方法 我需要做的是: 从URL路径为静态资产(js、图像、css、html等)提供服务:/assets/ 将这些静态资产存储在文件系统目录中,并映射到上述路径 对于未找到的任何静态资产请求,返回404 从一组命名URL路径中公开REST api:/api/和/anotherapi/etc 对于这些URL路

我正在尝试构建一个SPA后端(静态内容服务器,api),其中包含一些需要灵活的URL重写/路由/处理的附加功能/控件。事实证明,这些要求很难一起实现,尽管我在这里通读了一些类似的答案,尝试了这种方法

我需要做的是:

  • 从URL路径为静态资产(js、图像、css、html等)提供服务:/assets/
  • 将这些静态资产存储在文件系统目录中,并映射到上述路径
  • 对于未找到的任何静态资产请求,返回404
  • 从一组命名URL路径中公开REST api:/api/和/anotherapi/etc
  • 对于这些URL路径之外的所有其他请求,请service/index.htm引导SPA
  • 到目前为止,我有以下几点

    对于REST API:

    @RestController
    @RequestMapping(value="/api/**")
    public class StateAPIController {
    
        @RequestMapping(value = {"/api/method1"}, method = RequestMethod.POST)
        @ResponseBody
        public String method1() {
            return "method1...";
        }
    
        @RequestMapping(value = {"/api/method2"}, method = RequestMethod.POST)
        @ResponseBody
        public String method2() {
            return "method2...";
        }
    
    }
    
    (这个很好用)

    用于从特定文件系统位置呈现静态文件并将“/”映射到“/index.htm”:

    (这是可行的,但不确定是否是解决此问题的最佳方法)

    要将任何其他请求(在这些保留路径之外)重定向/转发到“/”(因此“/index.htm”):

    (这只是部分有效…我需要帮助解决的主要问题)

    因此,在这里,我需要排除路径列表(/assets/&/api/),但事实证明,在RequestMapping中使用regex/AntPathMatcher过滤器很难做到这一点,并且存在错误匹配(不应该显示index.htm时显示index.htm)和未命中(应该显示index.htm时显示404s)

    由于上述原因,当某个保留路径(例如资产)下缺少资源时,我也无法正确地为404服务

    a) 最好的方法是什么?我完全弄错了吗?有更好的办法吗

    b) 我如何使正则表达式工作,因为它似乎没有遵循正常的正则表达式规则,而且我所看到的示例也没有达到我的目标…

    回答如下:

    根据这里的答案:

    用于排除/assets/的模式:
    value={”/{path:(?!.*资产)。+}/**“}

    @Configuration
    @EnableWebMvc
    public class AssetServerConfig implements WebMvcConfigurer {
    
        @Override
        public void addResourceHandlers(ResourceHandlerRegistry registry) {
            registry
                    .addResourceHandler("/")
                    .addResourceLocations("file:/some/path/index.htm");
            registry
                    .addResourceHandler("/assets/**")
                    .addResourceLocations("file:/some/path/assets/");
        }
    
        @Bean
        public ViewResolver viewResolver() {
            UrlBasedViewResolver viewResolver = new UrlBasedViewResolver();
            viewResolver.setViewClass(InternalResourceView.class);
            return viewResolver;
        }
    
    
    }
    
    
    @ControllerAdvice
    @RequestMapping(value="/**")
    public class AssetServerController {
    
        @RequestMapping(value = {"/**/{path:[^\\.]*}", "/{path:^(?!/assets/).*}", "/{path:^(?!/api/).*}"}, method = RequestMethod.GET)
        public String index() {
            return "forward:/";
        }
    
    }