一尘不染

Tomcat的extraResourcePaths和别名访问外部目录之间的区别

tomcat

一个简单的问题:在Tomcat7中,使用extraResourcePaths和别名访问应用程序外部的目录有什么区别?

我可以使用这两个server.xml代码片段之一,它们似乎都可以工作。两者似乎都成功加载了此URL
http://localhost/app/images/box.jpg。使用一个相对于另一个有优势吗?

<Context docBase="Eclipse_Project" path="/app"
        reloadable="true" source="org.eclipse.jst.j2ee.server:Eclipse_Project"
        aliases="/images=D:\path\to\images"/>

要么

<Context docBase="Eclipse_Project" path="/app"
        reloadable="true" source="org.eclipse.jst.j2ee.server:Eclipse_Project">
        <Resources className="org.apache.naming.resources.VirtualDirContext"
                extraResourcePaths="/images=D:\path\to\images"/>
</Context>

阅读 498

收藏
2020-06-16

共1个答案

一尘不染

这是由于采用了多种不同的方式来提取不属于WAR或展开目录的资源的结果。坦白说,这是一个早该清理的烂摊子。为Servlet 3.1(即Tomcat
8)建议的“覆盖”(或最终被称为)功能已引起了重大清理。当前所有的实现将被统一为一个实现。不过这还不是很漂亮,而且还需要一段时间才能完成。

别名被视为Web应用程序资源的外部。DirContext在检查其内部资源之前会先检查别名。因此,当您请求真实路径时,您将获得原始路径。

如果使用extraResourcePaths,它们将被视为Web应用程序资源的一部分。看来Eclipse已将应用程序资源的副本触发到工作目录。通常这样做是为了避免文件锁定。由于extraResourcePaths被视为web应用程序的一部分,因此它们也将被复制,并且getRealPath()报告复制的位置,因为这是Tomcat从中提供资源的位置。

2020-06-16