2008-12-08 153 views
10

我正在研究一個允許用戶上傳附件的Web應用程序。這些附件存儲在與Web應用程序不同的驅動器上。我如何創建一個別名(相當於Apache HTTP服務器的別名)到這個驅動器,以便用戶可以下載這些附件?如何在Apache Tomcat中創建「別名」?

目前我正在創建一個上下文文件並將其轉儲到CATALINA_HOME/conf/Catalina/localhost中,但每次都會隨機刪除它。上下文文件名爲attachments.xml,內容如下所示。我也讀過虛擬主機,但是如果我理解正確,那麼虛擬主機並不是我正在尋找的。我正在使用Apache Tomcat 6.0.18版。

attachments.xml:

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

回答

9

我花了很多時間研究這個發現解決了上下文文件的隨機刪除的解決方案。我發現在Apache的網站上此摘錄下的主機配置部分:

可以嵌套一個或多個上下文這個Host元素裏面 元素, 每一代表與此 虛擬主機相關的不同的Web應用程序 。

虛擬主機存儲在位於CATALINA_HOME \ CONF的server.xml文件。 Tomcat配置了本地主機作爲默認主機。所以,如果我們從第一篇文章添加attachments.xml的內容,我們得到如下:

<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> 

這是接近一個可以去定義類似Apache的HTTP服務器的別名,我想。

+1

這有一些繼承危險。請參閱我的回答以獲取更多信息 – 2008-12-16 20:05:08

+0

非常感謝。試圖找出1天以上的解決方案。這工作! – 2013-09-27 16:04:33

6

有多種選擇。

  1. 使用Apache作爲前端,通過mod_jk的或mod_proxy的
  2. 提供自己的應用程序下載的servlet,服務請求的文件
  3. 讓您想讓Tomcat提供一個Web應用程序的目錄委派到tomcat

每個都有一些缺點和一些優點。我非常喜歡第一種解決方案,原因很多:

  • 我的主要原因適用於unixoid系統,您顯然不是在談論:只有root可以綁定低於1024的端口,例如, 80.因此,tomcat需要以root身份運行(我知道有些機制允許用戶綁定到低端口,但我從來沒有使用它們)。 Apache通常以root用戶身份啓動,但一旦綁定端口80就會丟棄這些權限。
  • 據說Apache在服務靜態資源方面比tomcat好很多(我從來沒有測過它,但很難相信相反的結果)
  • 你明顯知道如何在apache中創建別名 - 它會是微不足道地這樣做。

關於下載的servlet:

這樣你就會有一個servlet服務您的靜態資源,你可能會綁定到的URL「/下載/ *」(例如,在應用程序,還可以處理文件上傳)你會獲得:

  • 您需要配置文件所在的文件只存儲一次的目錄
  • 如果需要你可以很容易地實現下載所需的權限檢查(例如,登錄)
  • 您只需部署一個完全獨立的應用程序。
  • 下載servlet很簡單 - 找到文件,在輸出流中設置它的名稱和文件類型,並逐字節地傳輸它,然後關閉輸出流(確保處理攻擊文件名稱,如「/download/../ ../../../etc/passwd「或」/download/C:/WINDOWS/someimportantfile.xxx「),例如通過使用獲取基目錄作爲單獨參數的java.io.File構造函數。

第三個選擇有一些嚴重的缺陷,並打開你的攻擊,如果你不把他們的特殊照顧:

  • Tomcat沒有服務目錄,但web應用。因此,「E:/ upload/attachments」至少需要一個名爲「WEB-INF」的目錄,其中包含「web.xml」。注意不要從上傳的Web應用程序提供對此目錄和文件的寫入權限。有了這個規定,你可以讓tomcat爲目錄服務。
  • 但是:將包含的web.xml配置爲不作爲jsp提供「* .jsp」,否則tomcat不會僅僅提供jsp文件而是執行它們。想象一下,有人上傳「index.jsp」與<% System.exit(0); %>或更多的惡意內容。

一個額外的想法:你不需要額外的crosscontext="true"。這意味着您爲了提供文件而部署的Web應用程序可以訪問其他Web應用程序,例如,能夠管理他們或訪問他們的私人數據。通常你根本不需要這個,如果你的問題你肯定不需要。

2

請參閱我的新問題的初始部分,瞭解如何通過編輯context.xml文件 How do I add aliases to a Servlet Context in java?來完成此操作。 現在有幾個人認爲,由於性能方面的原因,Tomcat不再需要(2012:Tomcat 6或7)來提供靜態內容。