单页应用程序的JavaSpring引导资源处理程序模式
我的Spring Boot配置中有以下内容:
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.setOrder(Ordered.HIGHEST_PRECEDENCE)
.addResourceHandler("**/*.*")
.addResourceLocations("file:static/");
}
由于我正在创建一个单页应用程序,如果以下情况属实,我希望此资源处理程序能够交付静态文件:
- URL不以/api开头
- 此资源处理程序包含一个与URL路径匹配的文件
如果没有匹配的文件,资源处理程序不应该用404响应,而是让调用通过项目的控制器
在其中一个例子中,我将我的后备策略放在索引中。html注释(同样,除非URL以/api开头):
@GetMapping({"/**", "/"})
最后一部分工作正常,但问题是,如果没有匹配的文件,资源处理程序将返回404,而不是让调用(我习惯了Node.js和Go的中间件模式)通过控制器。我怎样才能做到这一点?我可以创建自己的资源处理程序,使其更像中间件吗
例如,在Go with Echo中,您只需要启用HTML5,并为/api提供一个skipper函数:
func main() {
server := echo.New()
server.Use(middleware.Static("static"))
server.Use(middleware.StaticWithConfig(middleware.StaticConfig{
Root: "static",
HTML5: true,
Skipper: noHTML5IfAPICallSkipper,
}))
server.Logger.Fatal(server.Start(":1323"))
}
func noHTML5IfAPICallSkipper(context echo.Context) bool {
if strings.HasPrefix(context.Path(), "/api/") {
return true
}
return false
}
如何在Spring Boot中启用此单页应用程序路由模式
哦,顺便说一句,静态文件是从磁盘提供的,而不是从类路径或打包在jar中的任何东西提供的,这一点很重要。该服务将与Docker一起运行,并且必须能够从容器外部装载文件
# 1 楼答案
试试这个:
您必须添加到应用程序中。属性文件行:
如果要使用Docker,此路径需要引用内部Docker容器目录,例如:
/opt/app/statics
,然后将外部路径映射到:您必须添加到应用程序中。属性文件行:
static.path=/opt/app/statics
然后像这样执行docker:
docker run ... -v /absolute/static/path/at/host:/opt/app/statics image:version