How to disable directory listing for Jetty's WebAppContext?

27,288

Solution 1

You can set org.eclipse.jetty.servlet.Default.dirAllowed instead of dirAllowed:

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

Tested for Jetty 7.4.5.v20110725, 8.1.4.v20120524, 9.0.2.v20130417 and 9.2.0.v20140526.

Solution 2

For anyone using web.xml, you can also disallow it there. Find the default servlet (the one with Jetty's DefaultServlet), and set the dirAllowed parameter to false:

<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>

Solution 3

This works for me on Jetty v9.4.3:

web.xml:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
         http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
         version="3.1">

    <context-param>
        <param-name>org.eclipse.jetty.servlet.Default.dirAllowed</param-name>
        <param-value>false</param-value>
    </context-param>

</web-app>

Solution 4

If anyone happens across this looking for the equivalent in Jetty 6:

    <bean id="webAppContext" class="org.mortbay.jetty.webapp.WebAppContext">
    .
    .
    <property name="initParams">
        <map>               
            <entry key="org.mortbay.jetty.servlet.Default.dirAllowed" value="false" />
        </map>
    </property>
Share:
27,288
phatypus
Author by

phatypus

Updated on July 16, 2022

Comments

  • phatypus
    phatypus almost 2 years

    I'm embedding Jetty (version 7.4.5.v20110725) into a java application. I'm serving JSP pages in ./webapps/jsp/ using Jetty's WebAppContext, but if I visit localhost:8080/jsp/ I get Jetty's directory listing for the entire contents of ./webapps/jsp/. I've tried setting the dirAllowed parameter to false on the WebAppContext and it does not change the directory listing behavior.

    Disabling the directory listing on a ResourceHandler is simply done be passing false to setDirectoriesListed, works as expected. Can someone tell me how to do this for the 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();
        }
    
    }