1

我有一场战争,有一个映射到 /* 的 servlet。我想提供一些存储在 WAR 中的静态资源,所以我应该使用 [ServletContext.getResource()][1] 从 WAR 中检索资源,对吗?

我注意到使用 getResource() 的一个问题。似乎无法可靠地确定返回的 URL 是表示具有内容的资源还是只是文件夹资源(其他资源的容器),这种方式适用于所有 Java EE 容器。

举个例子,说这是WAR的内容

+ | +-hello.html +-文件夹/ | | | +-world.html | +-文件夹2/ | | | +-index.html | +-WEB-INF/

并且此 WAR 使用以下上下文路径部署:/test

我想让 hello.html 在http://example.com/test/hello.html可以访问 我想让 world.html 在http://example.com/test/folder/world.html可以访问 我不想要http://example.com/test/folder/可访问(我想为该 URL 生成 403 响应) 对于 URL http://example.com/test/folder2/我想显示索引的内容.html 对于 URL http://example.com/test/folder我想重定向到http://example.com/test/folder/ 对于 URL http://example.com/test/folder/index。 html我想重定向到http://example.com/test/folder/

如果我这样做,在 Tomcat 和 Glassfish 上:

ServletContext.getResource('folder/') 我将返回一个 URL,如果我尝试打开该 URL 的流,我会得到一个 FileNotFoundException,有点疯狂,但它告诉我资源是一个文件夹(存在但未找到 = = 文件夹)。

在 Weblogic(和 OC4J)上,我得到一个纯文本流,列出文件夹中的文件。如果您出于任何原因不想泄露文件夹的原始内容,这并不好。

如果我这样做,TC/GF 会变得更加混乱:

ServletContext.getResource('folder') 我得到与 ServletContext.getResource('folder/') 相同的结果。更奇怪的是,如果我执行 ServletContext.getResource('folder/hello.html') 我仍然会返回一个 URL,但在尝试打开流时会收到 FileNotFoundException。

我错过了什么?这似乎是一个基本需求(能够判断资源是代表文件夹还是文件),但我看不到可靠的跨 Java EE 容器方法可以做到这一点。我应该只使用 ClassLoader.getResource() 吗?

[1] http://docs.oracle.com/javaee/6/api/javax/servlet/ServletContext.html#getResource%28java.lang.String%29

4

1 回答 1

0

这就是所谓的“未定义行为”,留给容器供应商作为练习。该资源实际上不是一个文件,它是一个 jar 资源。

因此,我建议要完成您想要的操作,您可能需要将文件层次结构存储在文件系统中,而不是存储在 war 文件中,并通过 File api 访问它们。

于 2012-05-28T21:53:02.543 回答