【问题标题】:Determine if a URL returned by ServletContext.getResource() represents a folder or a file判断 ServletContext.getResource() 返回的 URL 是代表文件夹还是文件
【发布时间】:2012-05-28 17:38:08
【问题描述】:

我有一个映射到 /* 的单个 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 访问 我想通过http://example.com/test/folder/world.html 访问world.html 我不希望 http://example.com/test/folder/ 可访问(我想为该 URL 生成 403 响应) 对于 URL http://example.com/test/folder2/ 我想显示 index.html 的内容 对于 URL http://example.com/test/folder,我想重定向到 http://example.com/test/folder/ 对于网址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

【问题讨论】:

    标签: java jakarta-ee servlets


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-10-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-29
      • 1970-01-01
      • 2011-09-12
      • 1970-01-01
      相关资源
      最近更新 更多