Java Spring Boot SPA URL重写
我正在尝试构建一个SPA后端(静态内容服务器,api),其中包含一些需要灵活的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路
@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:/";
}
}