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

时间:2012-02-02 12:50:02

标签: java jetty embedded-jetty

我希望从嵌入式jetty服务器公开clientacesspolicy.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?

谢谢, 安迪

2 个答案:

答案 0 :(得分:19)

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

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

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

答案 1 :(得分:8)

您的代码无效,因为ContextHandler实际上并未提供内容服务。 一个小的调整将使工作,但要做你真正想要的事情,你需要编写自己的处理程序。

排序有效”版本:

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

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

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