【问题标题】:Spring Boot resource handler patterns for single page applications单页应用程序的 Spring Boot 资源处理程序模式
【发布时间】: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


【解决方案1】:

试试这个:

public class Application  extends WebMvcConfigurerAdapter { // or implements WebMvcConfigurer (Spring Boot 2)

    @Value("${static.path}")
    private String staticPath;

    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
         registry.addResourceHandler("/**/*.*").addResourceLocations("file:"+staticPath);
    }

    @Override
    public void addViewControllers(ViewControllerRegistry registry) {
        registry.addViewController("/").setViewName("/index.html");
    }

    ...
}

您必须在 application.properties 文件中添加以下行:

`static.path=path/to/static/content`

如果要使用 Docker,这个路径需要引用内部 docker 容器目录,例如:/opt/app/statics,然后将外部路径映射到这个:

您必须在 application.properties 文件中添加以下行:static.path=/opt/app/statics

然后像这样执行docker:

docker run ... -v /absolute/static/path/at/host:/opt/app/statics image:version

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-07-17
    • 2021-09-26
    • 2018-12-30
    • 1970-01-01
    • 2016-12-27
    • 1970-01-01
    • 2017-07-28
    相关资源
    最近更新 更多