gpt4 book ai didi

Tomcat WebdavServlet 服务于外部目录

转载 作者:行者123 更新时间:2023-11-28 21:58:26 25 4
gpt4 key购买 nike

有没有办法让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,我可以通过my-的http://localhost:8080/my-web-context/webdav浏览访问- web-context 仅限网络应用程序资源。

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

最佳答案

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


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

关于Tomcat WebdavServlet 服务于外部目录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27349903/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com