使用通配符的 Undertow 路由格式

Posted

技术标签:

【中文标题】使用通配符的 Undertow 路由格式【英文标题】:Undertow Routing Format using Wildcards 【发布时间】:2018-04-23 05:53:20 【问题描述】:

我的要求是提供“index.html”,无论请求中设置了什么路由。我引用了Routing template format for undertow,但无济于事。它似乎对人们有用。处理程序看起来像

PathHandler path1 = Handlers.path()
            .addPrefixPath("/*", new ResourceHandler(new FileResourceManager(new File(System.getProperty("user.dir")+"ed.jpg"), 100 * 1024)).setWelcomeFiles("index.html") );

并且正在添加处理程序

server = Undertow
                    .builder()
                    .addHttpListener(serverConfig.getHttpPort(), serverConfig.getHost())
                    .addAjpListener(serverConfig.getAjpPort(), serverConfig.getHost())
                    .setHandler(path1)
                    .build();

我也尝试过使用 PathResourceManager。那是行不通的。处理程序能够完美匹配没有通配符的路径。只有带有通配符的情况似乎会失败。

对此的任何帮助将不胜感激。

【问题讨论】:

如果我理解正确,无论 URL 路径是什么,您都只想提供单个文件 (index.html)? @aramaki 没错。我还有其他与后端调用匹配的路径,它们工作得很好。 我的答案中描述的解决方案对您有用吗? 【参考方案1】:

您不想使用PathHandler

相反,直接从自定义处理程序中使用 ResourceManager 为您的 HTML 文件提供服务,如下所示:

ResourceManager rm = new PathResourceManager(Paths.get("/path/to/your/folder"));
Resource r = rm.getResource("index.html");
Undertow.builder()
    .addHttpListener(8080, "0.0.0.0")
    .setHandler(Handlers.predicate(
        ex -> ex.getRequestMethod().equals(Methods.GET),
        ex -> r.serve(ex.getResponseSender(), ex, IoCallback.END_EXCHANGE),
        ResponseCodeHandler.HANDLE_405)
    ).build().start();

注意1:我使用谓词对请求动词/方法添加了一个简单的检查,只允许 GET 请求并回退到简单的 405 响应。

注意2:您可能希望将处理 HTML 文件的处理程序分派给工作线程。

【讨论】:

以上是关于使用通配符的 Undertow 路由格式的主要内容,如果未能解决你的问题,请参考以下文章

如何在命名路由有通配符的情况下使用命名路由

带有通配符的多个域的Laravel路由组,如何处理域后缀?

Laravel 5:API 路由 + 通配符路由导致意外行为

Laravel 3.x 路由问题 - 使用通配符获取错误的参数值

如何在 Angular 4 中使用路由器 url 通配符?

带有通配符的 Laravel 路由总是 404