确定ServletContext.getResource()返回的URL是否表示文件夹或文件

时间:2012-05-28 17:38:09

标签: java java-ee servlets

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

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

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

+ | + -hello.html + -folder / | | | + -world.html | + -folder2 / | | | + -index.html | + -WEB-INF /

并且使用上下文路径:/ test

部署此WAR

我想在http://example.com/test/hello.html访问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的内容 对于网址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

1 个答案:

答案 0 :(得分:0)

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

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