2009-09-25 117 views
3

我有一個靜態html,imgs,Flash內容的文件夾在webapp文件夾之外。現在我正在使用符號鏈接將該文件夾映射到我的webapp目錄中。我遇到的問題是當我取消部署應用程序時,它遵循符號鏈接並刪除所有這些文件。包裝默認的servlet,但覆蓋默認的webapp路徑

我試圖實現的解決方案之一是一個特殊的servlet,它包裝默認的servlet,但使用不同的相對路徑。我很難找到如何以覆蓋默認servlet路徑的方式來包裝默認servlet。

這裏是我的工作:

public void doGet(final HttpServletRequest req, final HttpServletResponse resp) 
    throws ServletException, IOException { 
    final RequestDispatcher rd = getServletContext().getNamedDispatcher("default"); 
    final HttpServletRequest wrapped = new HttpServletRequestWrapper(req) { 

     @Override 
     public String getServletPath() { 
      return "/usr/depot/repository"; 
     } 
    }; 

    rd.forward(wrapped, resp); 
} 

回答

2

您可以編寫自己的servlet來提供靜態內容(這並不困難),也可以嘗試擴展而不是包裝DefaultServlet。無論採用哪種方式,您的最終servlet都將在web.xml(使用「default」作爲servlet-name)時被配置爲代替默認值。

也就是說,DefaultServlet只會在webapp上下文中提供靜態內容;爲了改變你必須創建/綁定到JNDI你自己的ProxyDirContext實例指向外部文件夾,我不確定這是否會工作;其配置過程相當複雜。

嘗試覆蓋servlet路徑不會讓你得到任何地方。

0

這不是一個好主意。

Web容器或應用程序服務器可以部署在Web服務器後面,或者您可以簡單地將Web服務器與容器結合使用。只要把你的靜態文件放在那裏,並通過絕對路徑引用它們。

真的不需要這種黑客(對不起,但它就是這樣)。

無論是或簡單地部署他們的Web應用程序。

+0

不幸的是,內容需要在安全過濾器後面進行保護。我們已經爲大多數靜態內容運行apache httpd,但他的文件夾是特殊的。我同意這是一個黑客攻擊。 – Ruggs

1

我們有一個類似的問題,我們需要在多個應用程序中共享由CMS生成的一些文件。如果您不使用Windows,則符號鏈接是最簡單的方法。

我們爲CMS和Tomcat設置了2個帳號。這些文件對Tomcat是隻讀的,因此它不能刪除它們。

您也可以編寫一個小的Tomcat擴展,以便它可以在多個位置查找文件。看到這個網站,

http://blog.bazoud.com/post/2009/05/12/Multiples-docbases-avec-tomcat

您目前的做法是行不通的。 Tomcat需要在部署緩存中加載所有資源以使其可用。在請求處理中更改它爲時已晚。該擴展允許Tomcat從多個目錄加載資源。這種方法的缺點是你必須在server/lib中放入一個小的JAR。

+0

我最終決定創建一個映射到特定路徑的我自己的serlvet。我一直在使用符號鏈接,因爲這些文件是在多個應用程序節點之間共享的,但必須是可寫的。這當然不是理想的解決方案,但根據要求最好。 – Ruggs

3

您可以使用自己的實現重寫DefaultServlet。你可以完全將其子類化,它是一個公共類。 Here是DefaultServlet的功能規範,您需要遵守它。

另一方面,你可以忽略DefaultServlet,併爲你自己的解決方案,例如可以找到here

0

你可以改變你的web應用環境中不同的路徑。下面是這確實差取決於客戶端的用戶代理是否支持ES6服務的例子:

​​

然而,「ES5」和「ES6」,即使我們使用初始的斜槓,是Web應用程序的普通語境下的子目錄。使用此方法無法在上下文目錄之外打破。