1

/* にマップされた単一のサーブレットとの戦争があります。WAR に保存されている静的リソースを提供したいので、[ServletContext.getResource()][1] を使用して WAR からリソースを取得する必要がありますか?

getResource() の使用に関して、1 つの問題に気付きました。返された URL がコンテンツを含むリソースを表しているのか、それとも単なるフォルダー リソース (他のリソースのコンテナー) なのかを、すべての Java EE コンテナーで機能する方法で確実に判断することはできないようです。

例を挙げてみましょう。これが WAR の内容であるとします。

+ | +-hello.html +-フォルダ/ | | | | | +-world.html | +-folder2/ | | | | | +-index.html | +-WEB-INF/

この WAR は、/test のコンテキスト パスでデプロイされます。

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 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) では、フォルダ内のファイルを一覧表示するプレーン テキストの stream が返されます。なんらかの理由でフォルダーの生の内容を漏らしたくない場合、これは良くありません。

私が行うと、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 に答える