【问题标题】:Tomcat WebdavServlet to serve external directoryTomcat WebdavServlet 服务于外部目录
【发布时间】:2014-12-08 01:08:40
【问题描述】:

有没有办法让 Tomcat WebdavServlet 服务于外部目录而不是 webapp 上下文资源?我了解到WebdavServlet 扩展了DefaultServlet。我尝试扩展 WebdavServlet 并覆盖 resources ProxyDirContext 但它没有这样工作。它返回 null 并且不能脱离 webapp 上下文。我有这个结构。

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

如果我只是简单地配置WebdavServlet,我只能通过http://localhost:8080/my-web-context/webdavmy-web-context web app 资源浏览和访问。

或者,也许,除了我的 webapp 上下文资源之外,我可以配置将外部资源(即/data)添加到WebdavServlet/DefaultServlet 吗?如果是这样,这也可以解决我的用例。但符号链接不是首选。我知道这种配置可以在 Apache httpd webdav 模块中轻松完成,但我希望它在 Tomcat 上以便于 java webapp 集成。

【问题讨论】:

    标签: tomcat webdav


    【解决方案1】:

    最后,我得到了它的工作。 null 问题是因为resources.getEnvironment() 返回一个空白环境对象,该对象在DefaultServlet 处初始化。而ProxyDirContext 构造函数有contextName = env.get(CONTEXT); int i = contextName.indexOf('#'); 会抛出null。无论如何,这是工作代码。


    首先,它扩展 Tomcat WebdavServlet 并在配置了外部 repoPath 的情况下覆盖 servlet init() 内的 resources

    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>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-05
      • 1970-01-01
      • 2014-05-11
      • 2011-04-07
      相关资源
      最近更新 更多