ResourceHandler 停止托管带有码头 9 的文件 - 404 未找到错误(适用于码头 8)

ResourceHandler stop hosting files with jetty 9 - 404 not found error (works fine with jetty 8)

显然,ResourceHandler 停止使用 jetty 9 托管文件 - 404 not found error(适用于 jetty 8)。这是代码:

    ResourceHandler resourceHandler = new ResourceHandler();
    resourceHandler.setDirectoriesListed(true);
    resourceHandler.setResourceBase("some_resource_base");

    HandlerList handlerList = new HandlerList();
    handlerList.setHandlers(new Handler[]{servletHandler, resourceHandler});
    server.setHandler(handlerList);
    server.start();

这个带有已接受答案的问题似乎不适用于 jetty 9 - Serving static files w/ embedded Jetty

假设 servletHandlerServletContextHandler

(注意:最好不要是实际的ServletHandler,因为那是内部的class,不能直接实例化)

那么 resourceHandler 将永远不会被调用,因为 ServletContextHandler 链末端的 DefaultServlet 处理(或 Default404Servlet)将始终响应,不允许resourceHandler 甚至执行。

如果您有 ServletContextHandler,请不要使用 ResourceHandler 使用 ServletContextHandler 中的 DefaultServlet 来设置和提供您的静态文件。

万一有人正在寻找一个工作示例,这就是我将 ResourceHandler 与 ContextHandler 组合在一起的方式(部分基于当前的 Jetty 文档:Jetty documentation

        srv = new Server();
        ServerConnector srvConn = new ServerConnector(srv);
        srvConn.setHost("localhost");
        srvConn.setPort(8080);
        srvConn.setIdleTimeout(30000);
        srv.addConnector(srvConn);
        //used for webSocket comm later:
        ServletContextHandler context = new ServletContextHandler(ServletContextHandler.SESSIONS);
        context.setContextPath("/");

        //for static  content:
        ResourceHandler resH = new ResourceHandler();
        resH.setDirectoriesListed(true);
        resH.setWelcomeFiles(new String[]{ "index.html" });
        resH.setResourceBase("./my/web/root");
        ContextHandler resCtx = new ContextHandler();
        resCtx.setHandler(resH);

        //Add both ContextHandlers to server:
        ContextHandlerCollection handlers = new ContextHandlerCollection(resCtx, context);
        srv.setHandler(handlers);