2014-12-08 74 views
2

有什麼辦法讓Tomcat WebdavServlet只服務於外部目錄而不是webapp上下文資源嗎?我知道WebdavServlet延伸DefaultServlet。我嘗試擴展WebdavServlet,並覆蓋resourcesProxyDirContext但它沒有這樣工作。它返回null並且不能離開webapp上下文。我有這個結構。Tomcat WebdavServlet服務於外部目錄

  • 鏈接:http://localhost:8080/my-web-context
  • 部署:/usr/local/apache-tomcat-7.0.56/webapps/my-web-context
  • WebDAV的資源:/data

如果我只需配置WebdavServlet,我可以瀏覽僅透過my-web-context web應用程序資源的http://localhost:8080/my-web-context/webdav訪問。

或者,我可以配置添加外部資源(即/data)到WebdavServlet/DefaultServlet,除了我的webapp上下文資源嗎?如果是這樣,這也可以解決我的使用案例。但符號鏈接不是首選。我知道這種配置可以很容易地在Apache httpd webdav模塊中完成,但是我希望它可以在Tomcat上輕鬆實現java webapp集成。

回答

2

最後,我得到它的工作。 null問題是因爲resources.getEnvironment()返回在DefaultServlet處初始化的空白環境對象。並且ProxyDirContext構造函數有contextName = env.get(CONTEXT); int i = contextName.indexOf('#');會拋出null。無論如何,這是工作代碼。


首先,它延伸的Tomcat WebdavServlet並重寫resources內的servlet init()如果配置外部repoPath

public class MyWebdavServlet extends WebdavServlet { 

    @Override 
    public void init() throws ServletException { 
     super.init(); 

     String repoPath = getServletConfig().getInitParameter("repoPath"); 

     if (Strings.isNullOrEmpty(repoPath)) { 
      return; 
     } 

     FileDirContext fileDirContext = new FileDirContext(); 
     fileDirContext.setDocBase(repoPath); 

     //Hashtable<String, String> env = resources.getEnvironment(); won't work, throw null when we construct ProxyDirContext! 

     //setup environment object manually 
     Hashtable<String, String> env = new Hashtable<>(); 
     env.put(ProxyDirContext.HOST, resources.getHostName()); 
     env.put(ProxyDirContext.CONTEXT, resources.getContextPath()); 

     resources = new ProxyDirContext(env, fileDirContext); 
    } 

    //do more override... 

} 

而且在web.xml servlet映射將是:

<servlet> 
    <servlet-name>webdav</servlet-name> 
    <servlet-class>com.sankholin.webdav.MyWebdavServlet</servlet-class> 
    <init-param> 
     <param-name>debug</param-name> 
     <param-value>1</param-value> 
    </init-param> 
    <init-param> 
     <param-name>listings</param-name> 
     <param-value>true</param-value> 
    </init-param> 
    <init-param> 
     <param-name>readonly</param-name> 
     <param-value>false</param-value> 
    </init-param> 
    <init-param> 
     <param-name>repoPath</param-name> 
     <param-value>/data</param-value> 
    </init-param> 
</servlet> 

<servlet-mapping> 
    <servlet-name>webdav</servlet-name> 
    <url-pattern>/webdav/*</url-pattern> 
</servlet-mapping>