J'intègre Jetty (version 7.4.5.v20110725) dans une application Java. Je sers des pages JSP dans ./webapps/jsp/ à l'aide de WebAppContext de Jetty, mais si je visite localhost: 8080/jsp /, la liste du répertoire de Jetty contenant le contenu complet de ./webapps/jsp/ est affichée. J'ai essayé de définir le paramètre dirAllowed sur false sur WebAppContext et cela ne modifie pas le comportement de la liste de répertoires.
La désactivation de la liste des répertoires sur un ResourceHandler se fait simplement en passant false à setDirectoriesListed, fonctionne comme prévu. Quelqu'un peut-il me dire comment procéder pour 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();
}
}
Vous pouvez définir org.Eclipse.jetty.servlet.Default.dirAllowed
au lieu de dirAllowed
:
webAppContext.setInitParameter("org.Eclipse.jetty.servlet.Default.dirAllowed", "false");
Testé pour Jetty 7.4.5.v20110725, 8.1.4.v20120524, 9.0.2.v20130417 et 9.2.0.v20140526.
Pour ceux qui utilisent web.xml
, vous pouvez également le refuser ici. Recherchez le servlet par défaut (celui avec la variable DefaultServlet
de Jetty) et définissez le paramètre dirAllowed
sur 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>
Cela fonctionne pour moi sur 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>
Si quelqu'un cherche à trouver l'équivalent dans 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>
La solution alternative non mentionnée jusqu'ici consiste à ajouter le fichier index.html . Ce n’est probablement pas une solution très universelle, mais elle répondait à mes besoins. La valeur ajoutée est que cela est plus convivial: un utilisateur qui saisit accidentellement l'URL de votre application obtiendra une description lisible par l'homme de votre choix au lieu d'une page d'erreur générique de Jetty.
Pour moi, cela a fonctionné avec Jetty ver intégré. 9.4.5.
J'ai mis index.html à côté du répertoire WEB-INF.
Sous Linux avec Jetty 9.2 (mais je pense que c'est la même chose avec 9.x), à appliquer à toutes les instances basées sur Jetty et Jetty.
Vous pouvez changer dans le fichier /etc/jetty9/webdefault.xml
:
<init-param>
<param-name>dirAllowed</param-name>
<param-value>false</param-value>
</init-param>
J'ai aussi changé:
<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>
J'ai trouvé la page suivante sur le net qui décrit le même problème:
jetty-users-users-How-can-I-prev-Directory-Listing-in-WebAppContext
Je cite ce qui est mentionné dans l'une des entrées de cet article comme raison du problème:
le problème est que, pour une raison quelconque, Jetty ne fusionne pas correctement le webdefault.xml avec l'utilisateur web.xml lorsque le mode intégré est utilisé
et voici le code qui a été utilisé pour résoudre le problème:
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);
}
}
}
J'espère que cela résoudra le problème pour vous.