web-dev-qa-db-de.com

Wie deaktiviere ich die Verzeichnisliste für Jettys WebAppContext?

Ich binde Jetty (Version 7.4.5.v20110725) in eine Java-Anwendung ein. Ich versorge JSP-Seiten in ./webapps/jsp/ mit Jettys WebAppContext, aber wenn ich localhost besuche: 8080/jsp/erhalte ich die Jetty-Verzeichnisliste für den gesamten Inhalt von ./webapps/jsp/. Ich habe versucht, den Parameter dirAllowed im WebAppContext auf false zu setzen, und das Verhalten der Verzeichnisliste wird dadurch nicht geändert.

Das Deaktivieren der Verzeichnisliste in einem ResourceHandler wird einfach durchgeführt, indem false an setDirectoriesListed übergeben wird. Funktioniert wie erwartet. Kann mir jemand sagen, wie das für den WebAppContext geht?

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();
    }

}
21
phatypus

Sie können org.Eclipse.jetty.servlet.Default.dirAllowed anstelle von dirAllowed einstellen:

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

Getestet auf Anlegestelle 7.4.5.v20110725, 8.1.4.v20120524, 9.0.2.v20130417 und 9.2.0.v20140526.

41
benaonreg

Wenn Sie web.xml verwenden, können Sie es dort auch nicht zulassen. Suchen Sie das Standardservlet (das mit der DefaultServlet von Jetty) und setzen Sie den Parameter dirAllowed auf 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>
16
Brandon Mintern

Das funktioniert für mich auf 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>
7
Eng.Fouad

Wenn jemand auf der Suche nach dem Äquivalent in Jetty 6 ist:

    <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>
2
Bob Flannigon

Noch eine andere Methode, die funktioniert, ist die Anwendung dieser Konfiguration auf 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>
0
Reinderien

Die alternative Lösung, die bisher nicht erwähnt wurde, ist das Hinzufügen der Datei index.html . Wahrscheinlich ist dies keine sehr universelle Lösung, aber sie entsprach meinen Bedürfnissen. Der Mehrwert ist, dass dies benutzerfreundlicher ist - ein Benutzer, der versehentlich Ihre Anwendungs-URL eingibt, erhält eine lesbare Beschreibung Ihrer Wahl anstelle einer allgemeinen Fehlerseite von Jetty.

Bei mir hat das mit embedded Jetty ver geklappt. 9.4.5.

Ich habe index.html neben das WEB-INF-Verzeichnis gestellt.

In Linux mit Jetty 9.2 (aber ich denke, es ist dasselbe mit 9.x) auf alle Jetty- und Jetty-basierten Instanzen anzuwenden.

Sie können in der Datei /etc/jetty9/webdefault.xml Folgendes ändern:

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

Ich habe auch geändert:

<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>
0
enrico.devita

Ich habe die folgende Seite im Netz gefunden, die das gleiche Problem beschreibt:

Anlegestellen-Benutzer-How-can-I-verhindern-Directory-Listing-in-WebAppContext

Ich zitiere, was in einem der Einträge in diesem Beitrag als Grund für das Problem erwähnt wird:

das Problem ist, dass Jetty aus irgendeinem Grund die Datei webdefault.xml nicht ordnungsgemäß mit dem Benutzer web.xml zusammenführt, wenn der eingebettete Modus verwendet wird

im Folgenden finden Sie den Code, mit dem das Problem behoben wurde:

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);
             }
       }
   } 

Ich hoffe, es wird das Problem für Sie lösen.

0
user890904