kotlin 在找不到路径时,向下拖动ResourceHandler以返回相同的文件

wdebmtf2  于 2023-02-05  发布在  Kotlin
关注(0)|答案(2)|浏览(106)

我正在使用undertow静态地服务一个react单页应用程序。为了使客户端路由正确工作,我需要为服务器上不存在的路由返回相同的索引文件。(为了更好地解释click here问题。)
它当前使用以下ResourceHandler实现:

ResourceHandler(resourceManager, { exchange ->
    val handler = FileErrorPageHandler({ _: HttpServerExchange -> }, Paths.get(config.publicResourcePath + "/index.html"), arrayOf(OK))
    handler.handleRequest(exchange)
}).setDirectoryListingEnabled(false)

它工作,但它的hacky。我觉得必须有一个更优雅的方式来实现这一点?

enxuqcxy

enxuqcxy1#

我在undertow文档中找不到我需要的东西,不得不用它来解决这个问题。这个解决方案是针对嵌入式Web服务器的,因为这正是我所寻找的。我试图为一个带路由的Angular 2+单页应用程序做这个。这是我所得到的:

masterPathHandler.addPrefixPath( "/MY_PREFIX_PATH_", myCustomServiceHandler )
    .addPrefixPath( "/MY_PREFIX_PATH",
        new ResourceHandler( new FileResourceManager( new File( rootDirectory+"/MY_PREFIX_PATH" ), 4096, true, "/" ),
            new FileErrorPageHandler( Paths.get( rootDirectory+"/MY_PREFIX_PATH/index.html" ) , StatusCodes.NOT_FOUND ) ) );

下面是它的工作原理:

  • “myCustomServiceHandler”为服务器端逻辑提供处理程序,以处理发送到服务器的查询
  • “ResourceManager/FileResourceManager”提供位于应用程序(Angular )根路径中的文件
  • “FileErrorPageHandler”在查询客户端路由路径而不是真实的文件时提供应用程序的“index.html”页。它还在文件请求错误时提供此文件。

注意第一个“MY_PREFIX_PATH”后面的下划线“_”。我希望应用程序API URL与Web路径相同,但没有额外的逻辑,我决定使用下划线代替。

nvbavucw

nvbavucw2#

我检查MIME类型是否为 null,并在以下情况下提供 index.html

.setHandler(exchange -> {
    ResourceManager manager = new PathResourceManager(Paths.get(args[2]));
    Resource resource = manager.getResource(exchange.getRelativePath());
    if(null == resource.getContentType(MimeMappings.DEFAULT))
        resource = manager.getResource("/index.html");
    exchange.getResponseHeaders().put(Headers.CONTENT_TYPE, resource.getContentType(MimeMappings.DEFAULT));
    resource.serve(exchange.getResponseSender(), exchange, IoCallback.END_EXCHANGE);
})

相关问题