如何使用带有Quarkus的Vertx路由器将所有未找到的路由重定向到index.html? [英] How to re-direct all not found routes to index.html using the Vertx router with Quarkus?

查看:0
本文介绍了如何使用带有Quarkus的Vertx路由器将所有未找到的路由重定向到index.html?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个Quarkus应用程序,它全部打包了一个角度SPA(捆绑在JAR中)。Quarkus提供了供前端消费的后端API路由。构建Quarkus应用程序时,角度应用程序构建被复制到目标中的META-INF/resources路径。

我没有使用JAX-RS来注册我的路由。相反,我直接在fun onRouterReady(@Observes router: Router)方法内的Vertx路由器上以编程方式注册它们。

我希望将任何未被识别的路由(Vertx注册的路由或静态资源)重定向到index.html,以便我的角度应用程序可以从其所有路由加载。不幸的是,我找不到任何方法来做到这一点。

我不知道所有Quarkus路由如何工作。我怀疑Quarkus本身正在使用Servlet(或者可能是Vertx)注册一些路由,因为index.html在根上得到了正确的服务,但我的身份验证根可以阻止未经身份验证加载。

我尝试了通过搜索找到的各种东西,例如:

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

其中的想法是创建一个静态处理程序,然后是一个Catch-all,它会将请求重写到index.html,这样它就会被静态处理程序捕获,但这只会导致无限循环(静态处理程序似乎无法找到index.html)。

我还尝试过通过JAX-RS添加筛选器(我希望避免这样做),但也不起作用。

必须有某种方法来设置它,我确信Quarkus代码确实在某个地方起作用,但我找不到它。任何想法都很受欢迎。

推荐答案

因此,我将在此回答我自己的问题,因为给定的答案没有满足我的特定要求。

Quarkus确实通过RESTEasy独立类注册了自己的处理程序(即使我的应用程序中没有包含RESTEasy)。这包括热重新加载路由(用于开发模式)、一些安全路由和指向已知静态资源的静态路由处理程序(假设在编译时已知)。

静态资源处理程序被赋予低优先级,因此是最后被调用的处理程序之一。它似乎接受现有静态资源路径和路由路径(它将其用作/index.html)。

我犯的错误是没有足够仔细地遵循重新路由逻辑。我的代码:

router.route("/*").handler(StaticHandler.create())
router.route().handler({ context: RoutingContext ->
    context.reroute("index.html)
})
将拦截任何与路由不匹配的路径,并将它们重新路由到/index.html(我不打算进行重定向)。但是,重新路由会再次启动整个路由过程,因此我使用/index.html路径返回到我的通用处理程序,并再次尝试重新路由它(因为静态处理程序只是在很久以后才被调用)。

因此,解决方案是确保我只重新路由我尚未尝试重新路由的路径(并且我可以重新路由到/而不是/index.html):

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

和Quarkus添加的静态资源处理程序将负责其余部分。

这篇关于如何使用带有Quarkus的Vertx路由器将所有未找到的路由重定向到index.html?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆