如何在嵌入式 Undertow 服务器上启用目录列表和资源服务?

Posted

技术标签:

【中文标题】如何在嵌入式 Undertow 服务器上启用目录列表和资源服务?【英文标题】:How to enable directory listing and resource serving on an Embedded Undertow Server? 【发布时间】:2018-04-21 15:57:53 【问题描述】:

在undertow documentation site 上列出的示例中,它显示了如何配置 2 个 servlet 及其映射。但我找不到如何配置 default Servlet 以允许目录列表和资源服务。

DeploymentInfo servletBuilder = Servlets.deployment()
        .setClassLoader(ServletServer.class.getClassLoader())
        .setContextPath("/myapp")
        .setDeploymentName("test.war")
        .addServlets(
                Servlets.servlet("MessageServlet", MessageServlet.class)
                        .addInitParam("message", "Hello World")
                        .addMapping("/*"),
                Servlets.servlet("MyServlet", MessageServlet.class)
                        .addInitParam("message", "MyServlet")
                        .addMapping("/myservlet"));

DeploymentManager manager = Servlets.defaultContainer().addDeployment(servletBuilder);
manager.deploy();
PathHandler path = Handlers.path(Handlers.redirect("/myapp"))
        .addPrefixPath("/myapp", manager.start());

Undertow server = Undertow.builder()
        .addHttpListener(8080, "localhost")
        .setHandler(path)
        .build();
server.start();

它是一个可运行 jar 中的嵌入式 undertow 服务器。

【问题讨论】:

【参考方案1】:

添加servlet时,还要在servlet列表中添加"default" servlet with

Servlets.servlet("default", DefaultServlet.class)
.addInitParam(DefaultServlet.DIRECTORY_LISTING, "true")
.addInitParam(DefaultServlet.DEFAULT_ALLOWED, "true")
.addInitParam(DefaultServlet.ALLOW_POST, "false")
.addInitParam(DefaultServlet.RESOLVE_AGAINST_CONTEXT_ROOT, "true")

然后在部署容器之前将其添加到DeploymentInfo

servletBuilder.setResourceManager(new ClassPathResourceManager(App.class.getClassLoader(), "webapp"));

然后,您放入打包在 jar 中的 webapp 文件夹中的任何内容都将与部署在任何应用服务器中的任何普通 war/webapp 文件夹完全相同。

您可以使用任何名称或文件夹,webapp 只是一个示例。

【讨论】:

以上是关于如何在嵌入式 Undertow 服务器上启用目录列表和资源服务?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Undertow 嵌入式服务器中登录文件?

如何关闭嵌入式 Undertow 应用程序?

为嵌入的 Undertow 设置默认编码

Undertow 启用 url 重写

在 SSL Client Hello 之后,Undertow(我认为)关闭连接

如何在 Undertow 中启用 Access-Control-Allow-Origin?