如何禁用Jetty的WebAppContext的目录列表?

2022-09-01 18:04:46

我正在将Jetty(版本7.4.5.v20110725)嵌入到Java应用程序中。我正在使用Jetty的WebAppContext在./webapps/jsp/中提供JSP页面,但是如果我访问localhost:8080/ jsp/,我会获得Jetty的目录列表,其中包含./webapps/jsp/的全部内容。我尝试在WebAppContext上将dirAllowed参数设置为false,它不会更改目录列表行为。

禁用 ResourceHandler 上的目录列表只需将 false 传递给 setDirectoriesListed,按预期工作。有人可以告诉我如何为WebAppContext执行此操作吗?

import org.eclipse.jetty.server.Handler;
import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.server.handler.ContextHandler;
import org.eclipse.jetty.server.handler.HandlerList;
import org.eclipse.jetty.server.handler.ResourceHandler;
import org.eclipse.jetty.server.nio.SelectChannelConnector;
import org.eclipse.jetty.servlet.ServletContextHandler;
import org.eclipse.jetty.servlet.ServletHolder;
import org.eclipse.jetty.webapp.WebAppContext;

public class Test {

    public static void main(String[] args) throws Exception {
        Server server = new Server();
        SelectChannelConnector connector = new SelectChannelConnector();
        connector.setHost("127.0.0.1");
        connector.setPort(8080);
        server.addConnector(connector);

        // Create a resource handler for static content.
        ResourceHandler staticResourceHandler = new ResourceHandler();
        staticResourceHandler.setResourceBase("./webapps/static/");
        staticResourceHandler.setDirectoriesListed(false);

        // Create context handler for static resource handler.
        ContextHandler staticContextHandler = new ContextHandler();
        staticContextHandler.setContextPath("/static");
        staticContextHandler.setHandler(staticResourceHandler);

        // Create WebAppContext for JSP files.
        WebAppContext webAppContext = new WebAppContext();
        webAppContext.setContextPath("/jsp");
        webAppContext.setResourceBase("./webapps/jsp/");
        // ??? THIS DOES NOT STOP DIR LISTING OF ./webapps/jsp/ ???
        webAppContext.setInitParameter("dirAllowed", "false");

        // Create a handler list to store our static and servlet context handlers.
        HandlerList handlers = new HandlerList();
        handlers.setHandlers(new Handler[] { staticContextHandler, webAppContext });

        // Add the handlers to the server and start jetty.
        server.setHandler(handlers);
        server.start();
        server.join();
    }

}

答案 1

您可以设置而不是:org.eclipse.jetty.servlet.Default.dirAlloweddirAllowed

webAppContext.setInitParameter("org.eclipse.jetty.servlet.Default.dirAllowed", "false");

已针对 Jetty 7.4.5.v20110725、8.1.4.v20120524、9.0.2.v20130417 和 9.2.0.v20140526 进行测试。


答案 2

对于任何使用 的人,您也可以禁止它在那里。找到默认的 servlet(带有 Jetty 的 servlet),并将参数设置为 :web.xmlDefaultServletdirAllowedfalse

<servlet>
    <servlet-name>default</servlet-name>
    <servlet-class>org.eclipse.jetty.servlet.DefaultServlet</servlet-class>
    <init-param>
        <param-name>dirAllowed</param-name>
        <param-value>false</param-value>
    </init-param>
</servlet>

推荐