Tomcat WebdavServlet用于服务外部目录

时间:2014-12-08 01:08:40

标签: tomcat webdav

有没有办法让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/webdav的{​​{1}}网络应用资源浏览和访问。

或者,除了我的webapp上下文资源之外,我是否可以配置将外部资源(即my-web-context)添加到/data?如果是这样,这也可以解决我的用例。但符号链接不是首选。我知道这种配置可以在Apache httpd webdav模块中轻松完成,但我想在Tomcat上进行简单的java webapp集成。

1 个答案:

答案 0 :(得分:2)

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


首先,如果配置了外部WebdavServlet,它会扩展Tomcat 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>