2011-08-27 24 views
20

我將Jetty(版本7.4.5.v20110725)嵌入到Java應用程序中。我使用Jetty的WebAppContext在./webapps/jsp/中提供JSP頁面,但是如果我訪問localhost:8080/jsp /,我將獲取Jetty的./webapps/jsp/全部內容的目錄列表。我已經嘗試在WebAppContext上將dirAllowed參數設置爲false,並且不會更改目錄列表行爲。如何禁用Jetty的WebAppContext的目錄列表?

禁用ResourceHandler上的目錄列表只是將false傳遞給setDirectoriesListed,按預期工作。有人能告訴我如何爲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(); 
    } 

} 

回答

41

您可以設置org.eclipse.jetty.servlet.Default.dirAllowed而不是dirAllowed

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

測試的碼頭7.4.5.v20110725,8.1.4.v20120524,9.0.2.v20130417和9.2.0.v20140526。

+0

也適用於Jetty 8.1.4.v20120524。謝謝!!! – Tarlog

+0

和9.0.2.v20130417 – joscarsson

+1

和9.2.x也一樣! – Nishant

0

我發現在網上以下頁面描述了同樣的問題:

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

我引用什麼是在那個崗位作爲原因的問題中的一個條目中提到:

的問題是,由於某種原因,碼頭無法正常合併 webdefault.xml與用戶的web.xml時,嵌入模式下使用

和以下是用於解決該問題的代碼:

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

我希望這將解決這一問題爲您服務。

+0

遺憾的是它並沒有幫助:'ServletHolder [] = SVH webAppContext.getServletHandler ().getServlets();'返回一個零長度的數組。 – phatypus

2

如果有人越過這碼頭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

對於使用web.xml任何人,也可以有禁止它。查找默認的servlet(帶有碼頭的DefaultServlet),並設置dirAllowed參數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> 
+0

對我有用〜thx〜 – Junjie

3

這對我的作品在碼頭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

迄今未提及的替代解決方案是添加index.html文件。可能這不是一個非常通用的解決方案,但它符合我的需求。附加值是,這更方便用戶使用 - 意外輸入應用程序URL的用戶將獲得您選擇的人類可讀描述,而不是來自Jetty的一些通用錯誤頁面。

對我來說,這工作與嵌入式Jetty版本。 9.4.5。

我把index.html放在WEB-INF目錄旁邊。

0

在Linux中與Jetty 9.2(但我認爲它與9.x相同) 適用於所有碼頭和碼頭基地實例。

您可以在文件/etc/jetty9/webdefault.xml改變

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

我也發生了變化:

<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> 
相關問題