10

Jettyのドキュメントの例に従って、組み込みのJettyサーバーに簡単な書き換えルールを実装しようとしています。

/admin//admin.htmlに書き換えるリクエストが欲しいのですが。現時点では、リクエスト/admin/すると404エラーが発生しますが/admin.html見つかりません。/admin.htmlしかし、私が直接要求すれば、それは機能します!

stackoverflowには他にも2つの同様の投稿がありますが、質問に対する回答はありません。

コードは次のとおりです。

WebAppContext _ctx = new WebAppContext();
_ctx.setContextPath("/");
_ctx.setDefaultsDescriptor(JETTY_DEFAULTS_DESCRIPTOR);
_ctx.setParentLoaderPriority(true);       
_ctx.setWar(getShadedWarUrl());
_ctx.setResourceBase(getShadedWarUrl());

RewriteHandler rewriter = new RewriteHandler();
rewriter.setRewritePathInfo(true);
rewriter.setRewriteRequestURI(true);
rewriter.setOriginalPathAttribute("requestedPath");

RewritePatternRule admin = new RewritePatternRule();
admin.setPattern("/admin/");
admin.setReplacement("/admin.html");
admin.setTerminating(true); // this will stop Jetty from chaining the rewrites
rewriter.addRule(admin);

_ctx.setHandler(rewriter);

HandlerCollection _handlerCollection = new HandlerCollection();
_handlerCollection.setHandlers(new Handler[] {_ctx});
server.setHandlers(_result);
4

1 に答える 1

17

2行を置き換えます...

_ctx.setHandler(rewriter);
_handlerCollection.setHandlers(new Handler[] {_ctx});

rewriter.setHandler(_ctx);
_handlerCollection.setHandlers(new Handler[] {rewriter});

これにより、通常のコンテキスト処理の前にリライタルールが開始されます。

コンテキスト処理をツリーと考えてください。サンプルコードには...があります。

server
+--  HandlerCollection
     [0]-- WebAppContext
           +-- Your servlets and filters in web.xml
           +-- DefaultServlet
               +-- RewriteHandler

つまり、WebAppContextがリクエストを処理できない場合は、RewriteHandlerが実行されて、リクエストを処理できるかどうかが確認されます。他に一致するものがない場合WebAppContextに使用するように設定されているので、それは決して起こりません。DefaultServlet

提案された単純な変更により、ツリーが次のように変更されます...

server
+--  HandlerCollection
     [0]-- RewriteHandler
           +-- WebAppContext
               +-- Your servlets and filters in web.xml
               +-- DefaultServlet

これにより、が尋ねられるRewriteHandler前に、がそのことを実行できるようになります。WebAppContext

注:HandlerCollectionこのシナリオでも、コードでもう少し適切に使用することができます。

// _ctx.setHandler(rewriter);
// rewriter.setHandler(_ctx);
_handlerCollection.setHandlers(new Handler[] { rewriter, _ctx });

これにより、次のツリーが作成されます

server
+--  HandlerCollection
     [0]-- RewriteHandler
     [1]-- WebAppContext
           +-- Your servlets and filters in web.xml
           +-- DefaultServlet
于 2013-01-22T21:07:06.613 に答える