2011-08-27 27 views
20

Tôi đang nhúng Jetty (phiên bản 7.4.5.v20110725) vào một ứng dụng java. Tôi đang phục vụ các trang JSP bằng ./webapps/jsp/ bằng cách sử dụng WebAppContext của Jetty, nhưng nếu tôi truy cập localhost: 8080/jsp/I, hãy lấy danh sách thư mục của Jetty cho toàn bộ nội dung của ./webapps/jsp/. Tôi đã thử thiết lập tham số dirAllowed thành false trên WebAppContext và nó không thay đổi hành vi liệt kê thư mục.Làm thế nào để tắt danh sách thư mục cho WebAppContext của Jetty?

Vô hiệu hóa danh sách thư mục trên ResourceHandler chỉ đơn giản là thực hiện được chuyển false đến setDirectoriesListed, hoạt động như mong đợi. Ai đó có thể cho tôi biết làm thế nào để làm điều này cho 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(); 
    } 

} 

Trả lời

41

Bạn có thể đặt org.eclipse.jetty.servlet.Default.dirAllowed thay vì dirAllowed:

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

Tested cho Jetty 7.4.5.v20110725, 8.1.4.v20120524, 9.0.2.v20130417 và 9.2.0.v20140526.

+0

Hoạt động với Jetty 8.1.4.v20120524. Cảm ơn!!! – Tarlog

+0

Và với 9.0.2.v20130417 – joscarsson

+1

và với 9.2.x quá! – Nishant

0

Tôi tìm thấy trang sau đây trên mạng trong đó mô tả cùng một vấn đề:

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

tôi trích dẫn những gì được đề cập trong một trong các mục trong bài viết đó là lý do cho vấn đề này:

vấn đề là vì một số lý do Jetty không hợp nhất webdefault.xml với tệp web.xml của người dùng đúng khi chế độ nhúng được sử dụng

và sau đây là các mã được sử dụng để khắc phục những vấn đề:

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

Tôi hy vọng nó sẽ giải quyết vấn đề cho bạn.

+0

Đáng tiếc là nó đã không giúp đỡ: 'ServletHolder [] SVH = webAppContext.getServletHandler() .getServlets(); 'trả về một mảng có độ dài bằng không. – phatypus

2

Nếu có ai xảy ra trên này tìm kiếm tương đương trong 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

Đối với bất cứ ai sử dụng web.xml, bạn cũng có thể không cho phép nó ở đó. Tìm các servlet mặc định (một với Jetty của DefaultServlet), và thiết lập các tham số để 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

Tốt cho tôi ~ thx ~ – Junjie

3

này làm việc cho tôi trên 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

Giải pháp thay thế không được đề cập cho đến nay là thêm tệp index.html. Có lẽ đây không phải là một giải pháp rất phổ quát nhưng nó đáp ứng nhu cầu của tôi. Giá trị gia tăng là điều này thân thiện với người dùng hơn - người dùng vô tình nhập URL ứng dụng của bạn sẽ nhận được mô tả có thể đọc được của con người do bạn chọn thay vì một số trang lỗi chung từ Jetty.

Đối với tôi, điều này đã làm việc với Jetty được nhúng. 9.4.5.

Tôi đã đặt index.html bên cạnh thư mục WEB-INF.

0

trong linux với Jetty 9.2 (nhưng tôi nghĩ nó giống với 9.x) để áp dụng cho tất cả các trường hợp cơ sở cầu cảng và cầu tàu.

bạn có thể thay đổi trong tập tin /etc/jetty9/webdefault.xml

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

tôi cũng thay đổi:

<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> 
Các vấn đề liên quan