2011-08-27 7 views
20

Sto incorporando Jetty (versione 7.4.5.v20110725) in un'applicazione java. Sto servendo pagine JSP in ./webapps/jsp/ utilizzando WebAppContext di Jetty, ma se visito localhost: 8080/jsp/Ottengo l'elenco di directory di Jetty per l'intero contenuto di ./webapps/jsp/. Ho provato a impostare il parametro dirAllowed su false su WebAppContext e non modifica il comportamento dell'elenco di directory.Come disabilitare l'elenco di directory per WebAppContext di Jetty?

La disattivazione dell'elenco di directory su ResourceHandler avviene semplicemente passando a false per setDirectoriesListed, funziona come previsto. Qualcuno può dirmi come farlo per 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(); 
    } 

} 

risposta

41

È possibile impostare org.eclipse.jetty.servlet.Default.dirAllowed invece di dirAllowed:

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

testati per Jetty 7.4.5.v20110725, 8.1.4.v20120524, 9.0.2.v20130417 e 9.2.0.v20140526.

+0

Funziona anche con Jetty 8.1.4.v20120524. Grazie!!! – Tarlog

+0

E con 9.0.2.v20130417 – joscarsson

+1

e anche con 9.2.x! – Nishant

0

ho trovato la seguente pagina in rete che descrive lo stesso problema:

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

cito quanto riportato in una delle voci in quel post, come motivo per il problema:

il problema è che per qualche motivo Jetty non unifica correttamente il webdefault.xml con l'utente web.xml quando viene utilizzata la modalità incorporata

e seguito è riportato il codice che è stato utilizzato per superare il 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); 
      } 
     } 
    } 

Spero che risolverà il problema per voi.

+0

Purtroppo non ha aiutato: 'ServletHolder [] = SVH webAppContext.getServletHandler() .getServlets(); 'restituisce una matrice di lunghezza zero. – phatypus

2

Se qualcuno capita in questo cerca l'equivalente 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> 
16

per chiunque utilizzi web.xml, è anche possibile disabilitare lì. Trova il servlet di default (quello con molo di DefaultServlet), e impostare il parametro su dirAllowedfalse:

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

Buono per me ~ thx ~ – Junjie

3

Questo funziona per me su 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> 
0

La soluzione alternativa non menzionata finora è quella di aggiungere il file index.html. Probabilmente questa non è una soluzione molto universale, ma si adattava alle mie esigenze. Il valore aggiunto è che questo è più facile da usare: un utente che accede accidentalmente all'URL della tua applicazione otterrà una descrizione leggibile dall'utente di tua scelta anziché una pagina di errore generica da Jetty.

Per me questo ha funzionato con Jetty ver incorporato. 9.4.5.

Ho messo index.html accanto alla directory WEB-INF.

0

in linux con Jetty 9.2 (ma penso che sia lo stesso con 9.x) da applicare a tutte le istanze di jetty e jetty bases.

si può cambiare nel file /etc/jetty9/webdefault.xml

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

ho anche cambiato:

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