java jetty embedded-jetty

java - ¿Cómo deshabilitar el listado de directorios para WebAppContext de Jetty?



embedded-jetty (7)

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

Puede cambiar en el 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>

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

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


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

jetty-users-How-can-I-prevent-Directory-Listing-in-WebAppContext

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

el problema es que, por alguna razón, Jetty no combina el 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 superar 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 te resuelva el problema.


Esto funciona para mí 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>


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

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

He puesto index.html al lado del directorio WEB-INF.


Para cualquier persona que use web.xml , también puede deshabilitarlo allí. Encuentre el servlet predeterminado (el que tiene el servicio predeterminado de Jetty) y establezca el parámetro dirAllowed en 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>


Puede configurar org.eclipse.jetty.servlet.Default.dirAllowed lugar de dirAllowed :

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

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


Si alguien pasa por esto buscando el equivalente en 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>