0

Java プロジェクトで埋め込まれた桟橋を使用しています。何らかの理由で、resourceHandler に送信するパスは c:\ (小文字) であり、C:\ (大文字) にエイリアスされています。このため、私の静的コンテンツは提供されていません。

jetty が絶対パスと標準パスを比較してエイリアスを検出することを示すいくつかのドキュメントを読みました。ログに次のように表示されます。

[qtp15485575-19] INFO org.eclipse.jetty.server.handler.ResourceHandler - file:/c:/filepath の別名 file:/C:/filepath

誰でも解決方法について何か考えがありますか?

更新: このために Eclipse に記録されたバグ: https://bugs.eclipse.org/bugs/show_bug.cgi?id=471526

彼らの反応は次のとおりです。

明示的に許可されていない限り、すべての URI が拒否されると仕様に記載されていた場合、エイリアスをチェックする必要はありません。ただし、代わりに、明示的に拒否されたものを除くすべての URI を許可するモデルがあります。

したがって、セキュリティ上の制約が /secretfile.txt に設定されている場合、そのファイルのエイリアスも制約されていることを確認する必要があります...そして FS に依存しない方法でそれを行います。つまり、さまざまなオペレーティング システムでブロックする必要がある場合があります。

/sEcRetFile.TXT
/secretfile.txt 
/SECRE~01.TXT
/secretfile.txt@@0

等等等

念のため、エイリアス システムを実装しました。

通常、c: と C: で問題が発生することはありません。これは、コンテキストを構成するときに正規化する必要があるため、正しいものを使用する必要があるためです。しかし、ファイルシステムはリリースごとに動作が変わるため、非常に煩わしい場合があります。

これは、Path クラスを使用してパスの一部をより適切に調べることができる jetty 9.3 で、いくらかうまく処理されていると思います。」

したがって、可能であれば Jetty 9 を使用し、それでも問題が解決しない場合は Joakin の修正を使用するのがおそらく最善の策です。

4

1 に答える 1

1

ResourceHandler完全で絶対的な実際のパスを指定してください。

package jetty.resource;

import java.io.File;
import java.nio.file.Path;

import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.server.handler.ResourceHandler;
import org.eclipse.jetty.util.resource.PathResource;

public class ResourceHandlerFromFSExample
{
    public static void main(String[] args) throws Exception
    {
        Server server = new Server(8080);

        Path webRootPath = new File("src/test/webroot").toPath().toRealPath();

        System.err.println("WebRoot is " + webRootPath);

        ResourceHandler handler = new ResourceHandler();
        handler.setBaseResource(new PathResource(webRootPath));
        handler.setDirectoriesListed(true);

        server.setHandler(handler);

        server.start();
        server.join();
    }
}

ところで、DefaultServlet静的ファイルの提供には依然としてより良い選択です

于 2015-07-01T14:08:22.560 に答える