Undertow ResourceHandler 以在找不到路径时返回相同的文件



我正在使用undertow静态地为反应单页应用程序提供服务。为了使客户端路由正常工作,我需要为服务器上不存在的路由返回相同的索引文件。(有关问题的更好解释,请单击此处。

它目前使用以下资源处理程序实现:

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

它有效,但它很笨拙。我觉得一定有更优雅的方式来实现这一目标吗?

我在暗流文档中找不到我需要的东西,不得不使用它才能找到解决方案。该解决方案适用于嵌入式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"为服务器端逻辑提供处理程序,以处理发送到服务器的查询
  • "资源管理器/文件资源管理器"提供位于应用程序(角度(根路径中的文件
  • "FileErrorPageHandler"在查询到客户端路由路径而不是实际文件时提供应用程序的"索引.html"页。它还会在文件请求错误时提供此文件。

请注意第一个"MY_PREFIX_PATH"后面的下划线"_"。我想让应用程序 API URL 与 Web 路径相同,但没有额外的逻辑,我选择了下划线。

我检查 MIME 类型中的空和服务索引.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);
})

相关内容

  • 没有找到相关文章

最新更新