¿Cómo deshabilitar la lista de directorios para WebAppContext de Jetty?

Estoy incorporando Jetty (versión 7.4.5.v20110725) en una aplicación Java. Estoy sirviendo páginas JSP en ./webapps/jsp/ usando WebAppContext de Jetty, pero si visito localhost: 8080 / jsp / obtengo la lista del directorio de Jetty para todo el contenido de ./webapps/jsp/. Intenté configurar el parámetro dirAllowed en falso en WebAppContext y no cambia el comportamiento de la lista de directorios.

Deshabilitar la lista de directorios en ResourceHandler simplemente se hace pasando falso a setDirectoriesListed, funciona como se esperaba. ¿Alguien puede decirme cómo hacer esto para 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();
    }

}

preguntado el 27 de agosto de 11 a las 23:08

8 Respuestas

Puede establecer org.eclipse.jetty.servlet.Default.dirAllowed en lugar de dirAllowed:

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

Probado para Jetty 7.4.5.v20110725, 8.1.4.v20120524, 9.0.2.v20130417 y 9.2.0.v20140526.

Respondido 23 Jul 14, 18:07

¿Cómo establecemos dirAllowed en un proyecto configurado con un bean? He incluido el problema al que me enfrento junto con el código en este enlace. Puede ayudarme alguien, por favor. - Jalin Gladis

Para cualquiera que use web.xml, también puede rechazarlo allí. Encuentre el servlet predeterminado (el que tiene Jetty DefaultServlet) y establezca dirAllowed parámetro para 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>

Respondido 16 Jul 13, 04:07

Esto me funciona en 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>

Respondido 07 Abr '17, 18:04

Si alguien se cruza con esto buscando el equivalente en Embarcadero 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>

Respondido 08 Feb 13, 17:02

Encontré la siguiente página en la red que describe el mismo problema:

usuarios-del-embarcadero-¿Cómo puedo-prevenir-el-listado-directorio-en-WebAppContext

Cito lo que se menciona en una de las entradas de esa publicación como motivo del problema:

el problema es que, por alguna razón, Jetty no fusiona webdefault.xml con el usuario web.xml correctamente cuando se usa el modo incrustado

y el siguiente es el código que se utilizó para solucionar el problema:

HashMap hmap = new HashMap<String, String>();
   hmap.put("dirAllowed", "false");
   hmap.put("redirectWelcome", "false");
   hmap.put("aliases", "false");
   ServletHolder []svh = wc.getServletHandler().getServlets();
   if(svh != null && svh.length > 0)
   {
           for(int j = 0; j < svh.length; j++)
      {
              ServletHolder svh1 = svh[j];
            if(svh1.getClassName() != null && svh1.getClassName().endsWith(DEFAULT_SERVLET))
            {
               svh1.setInitParameters(hmap);
             }
       }
   } 

Espero que le resuelva el problema.

Respondido 28 ago 11, 13:08

Desafortunadamente, no ayudó: ServletHolder[] svh = webAppContext.getServletHandler().getServlets(); devuelve una matriz de longitud cero. - phatypus

La solución alternativa no mencionada hasta ahora es agregar la index.html expediente. Probablemente esta no sea una solución muy universal, pero se ajustó a mis necesidades. El valor agregado es que esto es más fácil de usar: un usuario que ingrese accidentalmente la URL de su aplicación obtendrá una descripción legible por humanos de su elección en lugar de una página de error genérica de Jetty.

Para mí, esto funcionó con Jetty ver. 9.4.5.

Puse index.html al lado del directorio WEB-INF.

contestado el 26 de mayo de 17 a las 23:05

En Linux con Jetty 9.2 (pero creo que es lo mismo con 9.x) para aplicar a todas las instancias basadas en Jetty y Jetty.

Puedes cambiar de archivo /etc/jetty9/webdefault.xml:

<init-param>
  <param-name>dirAllowed</param-name>
  <param-value>false</param-value>
</init-param>

También he cambiado:

<init-param>
     <param-name>welcomeServlets</param-name>
     <param-value>true</param-value>
  </init-param>
  <init-param>
     <param-name>redirectWelcome</param-name>
     <param-value>true</param-value>
  </init-param>

respondido 29 mar '18, 16:03

Otro método que funciona es aplicar esta configuración a jetty-web.xml:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN"
          "http://www.eclipse.org/jetty/configure_9_3.dtd">
<Configure class="org.eclipse.jetty.webapp.WebAppContext">

  <Call name="setInitParameter​">
    <Arg>org.eclipse.jetty.servlet.Default.dirAllowed</Arg>
    <Arg type="boolean">False</Arg>
  </Call>

</Configure>

Respondido 07 Jul 19, 21:07

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.