Как перенаправить все не найденные маршруты в index. html, используя маршрутизатор Vertx с Quarkus? - PullRequest
2 голосов
/ 14 апреля 2020

У меня есть приложение Quarkus, которое упаковывает Angular SPA (входит в JAR). Quarkus предоставляет API-интерфейсы для бэкэнда. При сборке приложения Quarkus сборка приложения Angular копируется в путь META-INF/resources в целевом объекте.

Я не использую JAX-RS для регистрации своих маршрутов. Вместо этого я непосредственно регистрирую их программно на маршрутизаторе Vertx в методе fun onRouterReady(@Observes router: Router).

Я хотел бы, чтобы любой маршрут не был распознан (либо как зарегистрированный Vertx маршрут, либо как ресурс stati c) быть перенаправленным на index.html, чтобы мое приложение Angular могло загружаться со всех его маршрутов. К сожалению, я не смог найти никакого способа сделать это.

Я не знаю, как функционируют все маршруты Quarkus. Я подозреваю, что сам Quarkus регистрирует некоторые маршруты с использованием сервлетов (или, возможно, Vertx), потому что index.html правильно обслуживается на root, но моя аутентификация root может предотвратить загрузку без аутентификации.

Я пробовал различные вещи, которые я нашел в результате поиска, такие как:

router.route("/*").handler(StaticHandler.create())
router.route().handler({ context: RoutingContext ->
    context.reroute("index.html)
})

, где идея состоит в том, чтобы создать обработчик stati c, а затем перехватить все, что перезапишет запрос в index.html, так что он затем перехватывается обработчиком stati c, но это просто приводит к бесконечному l oop (кажется, что обработчик stati c не может найти index.html).

I Я также пытался добавить фильтр через JAX-RS (чего я хотел бы избежать), но это тоже не работает.

Должен быть какой-то способ настроить это, и я уверен, что код Quarkus действительно где-то работает , но я не могу найти это. Любые идеи высоко ценится.

Ответы [ 2 ]

1 голос
/ 14 апреля 2020

Вы должны наблюдать Router где-нибудь в классе области приложения и установить обработчик ошибок 404 для перенаправления на index.html

public void init(@Observes Router router) {
        router.errorHandler(404, routingContext -> {
            routingContext.response().setStatusCode(302).putHeader("Location", "/index.html").end();
        });
}

PS с использованием routingContext.reroute("index.html"); также будет работать, но он сохранит путь как это было (например, вы написали /testabc, он покажет ваш файл html, но путь не будет /index.html). Если вам нужно именно это, замените его на ваш вариант внутри errorHandler

0 голосов
/ 24 апреля 2020

Итак, я отвечу на свой вопрос здесь, так как у меня были особые требования, которые не были удовлетворены данным ответом.

Quarkus действительно регистрирует свои собственные обработчики через отдельный класс RestEasy (даже если RestEasy не включены в мое приложение). Сюда входят маршруты горячей перезагрузки (для режима разработки), некоторые маршруты безопасности и обработчики маршрутов stati c, указывающие на известные ресурсы stati c (предположительно известные во время компиляции).

stati c обработчику ресурсов присваивается низкий приоритет, поэтому он вызывается одним из последних. Кажется, он принимает существующие пути к ресурсам stati c и путь к маршруту (который он использует как /index.html).

Ошибка, которую я сделал, заключалась в том, что я недостаточно тщательно следовал логи перенаправления c. Мой код:

router.route("/*").handler(StaticHandler.create())
router.route().handler({ context: RoutingContext ->
    context.reroute("index.html)
})

будет перехватывать любые пути, которые не были сопоставлены с маршрутами, и перенаправлять их (я не собираюсь делать перенаправление) на /index.html. Однако повторная маршрутизация снова запускает весь процесс маршрутизации, поэтому я вернулся к своему универсальному обработчику с путем /index.html и снова попытался перенаправить его (потому что обработчик stati c вызывается намного позже ).

Поэтому решение состоит в том, чтобы гарантировать, что я буду перенаправлять только пути, которые я еще не пытался перенаправить (и я могу перенаправить на / вместо /index.html):

router.routeWithRegex("\\/.+").handler({ context: RoutingContext ->
    context.reroute("/")
})

и обработчик ресурсов stati c с добавлением Quarkus позаботится обо всем остальном.

...