【发布时间】:2018-05-18 22:47:46
【问题描述】:
我的 Spring Boot 配置中有以下内容:
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.setOrder(Ordered.HIGHEST_PRECEDENCE)
.addResourceHandler("**/*.*")
.addResourceLocations("file:static/");
}
由于我正在创建单页应用程序,因此如果满足以下条件,我希望此资源处理程序传递静态文件:
- URL 不以 /api 开头
- 此资源处理程序包含一个与 URL 中的路径匹配的文件
如果没有匹配的文件,资源处理程序不应以 404 响应,而是让调用通过项目的控制器。
在其中一个中,我将我的后备放在 index.html 注释中(同样,除非 URL 以 /api 开头):
@GetMapping({"/**", "/"})
最后一部分工作正常,但问题是如果没有匹配的文件,资源处理程序会返回 404,而不是让调用通过(我习惯于 Node.js 和 Go 的中间件模式)到控制器.我怎样才能做到这一点?我可以创建自己的资源处理程序来充当更多的中间件吗?
例如,在 Go with Echo 中,您只需为 /api 启用带有跳过功能的 HTML5:
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 一起运行,并且必须能够从容器外部挂载文件。
【问题讨论】:
-
stackoverflow.com/a/47427729/1032167 可能类似,我最终使用了自定义
ResourceResolver的方法。您可以在此自定义ResourceResolver中指定您想要的任何位置:文件或类路径。这只是一个供您查看的方向,因为链接答案从不向控制器传递任何内容,并且几乎为每个请求返回索引页面,除了静态文件/api/自定义控制器。
标签: java spring spring-boot single-page-application static-files