4

(組み込み) Jetty では、ResourceHandler を使用して静的ファイルを提供し、カスタム ハンドラーを使用して動的要求に応答しようとしています。このページに基づいて、次のようなセットアップを行いました。

public static void main(String[] args) throws Exception
{
    Server server = new Server();
    SelectChannelConnector connector = new SelectChannelConnector();
    connector.setPort(8080);
    server.addConnector(connector);

    ResourceHandler resource_handler = new ResourceHandler();
    resource_handler.setDirectoriesListed(false);

    resource_handler.setResourceBase(".");

    HandlerList handlers = new HandlerList();
    handlers.setHandlers(new Handler[] { resource_handler, new MyHandler() });
    server.setHandler(handlers);

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

これは、次のように正しく機能します。

  • /public/style.css など、パブリック ディレクトリ内のファイルから静的コンテンツを提供します
  • /foo/bar など、パブリック ディレクトリに存在しないパスで MyHandler を実行します。

問題は、ルート パス (/) に応答して 403 が返されることです。MyHandler はこれらのリクエストに応答できますが、最初に ResourceHandler によってインターセプトされます。Jetty に MyHandler への送信/リクエストを強制する方法はありますか?

前もって感謝します!

4

2 に答える 2

2

私の解決策:

  • MyHandler を "/" とは異なるコンテキスト パス ("/index" など) に配置します。
  • 書き換えルールを使用して「/」への呼び出しをインターセプトし、それらを「/index」にリダイレクトします

私が使用するコードは次のようになります。

RewriteHandler rewriteHandler = new RewriteHandler();
rewriteHandler.setRewriteRequestURI(true);
rewriteHandler.setRewritePathInfo(false);
rewriteHandler.setOriginalPathAttribute("requestedPath");
RewriteRegexRule rewriteIndex = new RewriteRegexRule();
rewriteIndex.setRegex("^/$");
rewriteIndex.setReplacement("/index.html");
rewriteHandler.addRule(rewriteIndex);
rewriteHandler.setHandler(rootHandlerCollection);
server.setHandler(rewriteHandler);

正規表現は正確なパスのみに一致することを保証するため、"/whatever" は依然として ResourceHandler によって最初に処理されます。

于 2014-08-20T13:22:46.513 に答える