2008-12-08 36 views
10

Tôi đang làm việc trên một ứng dụng web cho phép người dùng tải lên tệp đính kèm. Các tệp đính kèm này được lưu trữ trên một ổ đĩa khác với tệp của ứng dụng web. Làm thế nào tôi có thể tạo một bí danh (tương đương với bí danh của máy chủ HTTP Apache) cho ổ đĩa này để người dùng có thể tải xuống các tệp đính kèm này?Làm cách nào để tạo "Bí danh" trong Apache Tomcat?

Hiện tại tôi đang tạo một tệp ngữ cảnh và bán nó trong CATALINA_HOME/conf/Catalina/localhost, nhưng nó được xóa ngẫu nhiên thường xuyên. Tệp ngữ cảnh có tên attachments.xml và nội dung được hiển thị bên dưới. Tôi cũng đã đọc về máy chủ ảo, nhưng nếu tôi hiểu chính xác, thì máy chủ ảo không phải là thứ mà tôi đang tìm kiếm. Tôi đang sử dụng phiên bản 6.0.18 của Apache Tomcat.

attachments.xml:

<?xml version="1.0" encoding="UTF-8"?> 
<Context docBase = "e:\uploads\attachments" 
    reloadable = "true" 
    crossContext = "true"> 
</Context> 

Trả lời

9

tôi đã dành nhiều thời gian hơn nghiên cứu này và tìm thấy một giải pháp mà giải quyết việc xóa ngẫu nhiên của các tập tin ngữ cảnh. Tôi thấy đoạn trích này trên trang web của Apache dưới phần cấu hình máy chủ:

Bạn có thể làm tổ một hoặc nhiều bối cảnh yếu tố bên trong phần tử chủ này, từng đại diện cho một ứng dụng web khác nhau liên quan đến máy chủ ảo này.

Các máy ảo được lưu trữ trong các server.xml tập tin nằm ở CATALINA_HOME \ conf. Tomcat được cấu hình với localhost làm máy chủ lưu trữ mặc định. Vì vậy, nếu chúng ta thêm các nội dung của attachments.xml từ bài viết đầu tiên, chúng tôi nhận được như sau:

<Host name="localhost" appBase="webapps" 
    unpackWARs="true" autoDeploy="true" 
    xmlValidation="false" xmlNamespaceAware="false"> 

    <Context path="/attachments" 
      docBase="e:\uploads\attachments" 
      reloadable="true" 
      crossContext="true" /> 
</Host> 

Đây là càng gần càng ai có thể có được để xác định bí danh tương tự như máy chủ Apache HTTP, tôi nghĩ.

+1

Có một số nguy cơ kế thừa với điều này. Xem câu trả lời của tôi để biết thêm thông tin –

+0

Rất cám ơn vì điều này. Đã cố gắng tìm ra giải pháp trong hơn 1 ngày. Điều này đã làm việc! –

6

Có nhiều tùy chọn.

  1. Sử dụng Apache như frontend, ủy thác cho tomcat bởi mod_jk hoặc mod_proxy
  2. Cung cấp một servlet tải trong ứng dụng của riêng bạn, phục vụ các tập tin yêu cầu
  3. Hãy thư mục mà bạn muốn tomcat để cung cấp một ứng dụng web

từng có một số nhược điểm và một số lợi thế. Tôi rất thích giải pháp đầu tiên vì nhiều lý do:

  • Lý do chính của tôi áp dụng cho các hệ thống unixoid, rõ ràng là bạn không nói về: Chỉ root có thể liên kết các cổng thấp hơn 1024, ví dụ: 80. Therefor tomcat sẽ cần phải chạy như là người chủ (tôi biết rằng có cơ chế để cho phép người dùng liên kết với các cổng thấp, nhưng tôi đã không bao giờ nhận được để sử dụng chúng). Apache thường được bắt đầu bằng root nhưng giảm các đặc quyền này ngay khi cổng 80 bị ràng buộc.
  • Apache được cho là tốt hơn rất nhiều trong việc phục vụ tài nguyên tĩnh hơn tomcat (tôi chưa bao giờ đo lường nó, nhưng thấy khó mà tin được)
  • Bạn biết rõ cách tạo bí danh trong apache - nó sẽ là tầm thường để làm như vậy.

Về việc tải xuống servlet:

Bằng cách này bạn sẽ có một servlet phục vụ các tài nguyên tĩnh của bạn, mà bạn có thể liên kết với các url "/ download/*" (ví dụ như trong các ứng dụng mà cũng xử lý tập tin cập nhật) bạn muốn đạt được:

  • bạn cần phải cấu hình thư mục nơi các tập tin của bạn được lưu trữ chỉ một lần
  • Nếu bạn cần bạn có thể dễ dàng thực hiện kiểm tra sự cho phép (ví dụ như yêu cầu đăng nhập để tải về)
  • Bạn chỉ cần triển khai một ứng dụng hoàn toàn tự động.
  • Tải xuống servlet là tầm thường - tìm tệp, đặt tên và loại tệp trong luồng đầu ra và phát byte theo byte, sau đó đóng luồng đầu ra (đảm bảo xử lý các tên tệp tấn công như "/download/../ ../../../etc/passwd "hoặc" /download/C:/WINDOWS/someimportantfile.xxx "), vd bằng cách sử dụng hàm tạo java.io.File để lấy thư mục cơ sở dưới dạng tham số riêng biệt.

Lựa chọn thứ ba có một số nhược điểm nghiêm trọng và mở ra cho bạn cho các cuộc tấn công nếu bạn không chăm sóc đặc biệt trong số họ:

  • Tomcat không phục vụ thư mục, nhưng webapps. Vì "E:/upload/attachments" cần ít nhất một thư mục có tên "WEB-INF", chứa "web.xml". Cẩn thận không cung cấp quyền truy cập ghi vào thư mục và tệp này từ ứng dụng web tải lên. Với điều khoản này, bạn có thể cho phép tomcat phục vụ thư mục.
  • Tuy nhiên: Định cấu hình web.xml chứa để không phân phối "* .jsp" dưới dạng jsp, nếu không tomcat sẽ không chỉ phân phối tệp jsp mà thực thi chúng. Hãy tưởng tượng ai đó đang tải lên "index.jsp" với <% System.exit(0); %> hoặc nhiều nội dung độc hại hơn.

Một ý nghĩ khác: Bạn không cần thêm crosscontext="true". Điều này có nghĩa là ứng dụng web mà bạn triển khai chỉ để phân phát tệp của bạn có quyền truy cập vào các ứng dụng web khác, ví dụ: có thể quản lý hoặc truy cập dữ liệu cá nhân của họ. Thông thường bạn không cần điều đó chút nào, trong trường hợp của câu hỏi của bạn, bạn chắc chắn không muốn điều đó.

2

Xem phần ban đầu của câu hỏi mới hơn của tôi để biết cách thực hiện việc này bằng cách chỉnh sửa tệp context.xml How do I add aliases to a Servlet Context in java?. Theo một số người bây giờ, nó không còn cần thiết (2012: Tomcat 6 hoặc 7) để sử dụng Apache vì lý do hiệu suất trên Tomcat để phục vụ nội dung tĩnh.

+2

Để thêm vào những gì Paulus đã chỉ ra. Bí danh có thể được định nghĩa cho Tomcat 7. [documenation] (http://tomcat.apache.org/tomcat-7.0-doc/config/context.html) sẽ đáng xem nếu bạn đang chạy phiên bản này. Chúng có thể được nối với nhau 'aliases ="/shared =/[đường dẫn đến]/shared,/app1a =/[path to]/app1a "' – Chadwick

Các vấn đề liên quan