如何使用嵌入式码头在给定地址提供特定的类路径资源?

2022-09-03 18:19:54

我希望从嵌入式码头服务器公开客户端策略.xml文件。

我目前的尝试如下所示:

ContextHandler capHandler = new ContextHandler();
capHandler.setContextPath("/clientaccesspolicy.xml");
capHandler.setBaseResource(Resource.newClassPathResource("clientaccesspolicy.xml"));
HandlerList handlers = new HandlerList();
handlers.addHandler(capHandler);
...
httpServer.setHandler(handlers);

但是我得到了一个404访问 http://localhost:9000/clientaccesspolicy.xml

如何在 Jetty 中以编程方式将类路径资源公开给给定的 URL?

谢谢 安迪


答案 1

实际上,您可以将类路径注册为类路径资源(令人惊讶)。

ResourceHandler resHandler = new ResourceHandler();
resHandler.setBaseResource(Resource.newClassPathResource("/"));
server.setHandler(resHandler);

然后,您可以访问类路径中的任何文件。因此,如果您有一个文件.xml它将从localhost:9000 / file.xml提供。


答案 2

您的代码不起作用,因为 a 实际上并没有服务器化内容。一个小小的调整会让它有点工作,但要做你真正想要的事情,你需要编写自己的处理程序。ContextHandler

作品种类”版本:

ContextHandler capHandler = new ContextHandler();
capHandler.setContextPath("/clientaccesspolicy.xml");
ResourceHandler resHandler = new ResourceHandler();
resHandler.setBaseResource(Resource.newClassPathResource("clientaccesspolicy.xml"));
capHandler.setHandler(resHandler);

但是,该版本被视为一个目录,因此它会重定向到 XML 文件,然后显示该文件的内容。/clientaccesspolicy.xml/clientaccesspolicy.xml/

看起来你想要的是一个查找 url =>资源的版本。Jetty 没有附带执行此操作的处理程序,但您应该能够创建 一个子类,然后覆盖 。在这种情况下,您不需要[或不需要]ContextHandler,只需检查对“/clientaccesspolicy.xml”的调用,并将其映射到正确的ClassPath Resource。ResourceHandlerResourceHandlergetResource


推荐