Запрет ResourceHandler для возврата того же файла, когда путь не может быть найден - PullRequest
0 голосов
/ 30 сентября 2018

Я использую undertow, чтобы статически обслуживать одностраничные приложения.Чтобы клиентская маршрутизация работала правильно, мне нужно вернуть тот же индексный файл для маршрутов, которые не существуют на сервере.(Для более подробного объяснения проблемы нажмите здесь .)

В настоящее время он реализован с помощью следующего ResourceHandler:

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

Это работает, но взломано.Я чувствую, что должен быть более элегантный способ достижения этого?

1 Ответ

0 голосов
/ 27 июля 2019

Я не смог найти то, что мне нужно, в документации по откату, и мне пришлось поиграть с ним, чтобы найти решение.Это решение для встроенного веб-сервера, так как это то, что я искал.Я пытался сделать это для одностраничного приложения 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 доставляет файлы, расположенные в (угловом) корневом пути приложения
  • FileErrorPageHandler отображает страницу index.html приложения вСобытие, что запрос к пути на стороне клиента вместо реального файла.Этот файл также обрабатывается в случае неправильного запроса файла.

Обратите внимание на подчеркивание '_' после первого 'MY_PREFIX_PATH'.Я хотел, чтобы URL-адрес API приложения совпадал с веб-путем, но без лишней логики я остановился на подчеркивании.

...