2013-01-21 11 views
10

Jettyのマニュアルの例に従って、組み込みのJettyサーバに簡単な書き換えルールを実装しようとしています。Embedded Jettyの書き換えが正しく動作しない

/admin/へのリクエストを/admin.htmlに書きたいと思っています。 現時点で私が/admin/を要求した場合、/admin.htmlで404エラーが発生します。 しかし、私が/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); 

答えて

16

は2行を交換...

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

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

と書き換えルールが通常の前に蹴るようになります。ここでは

コードですコンテキスト処理。

コンテキスト処理をツリーと考えてください。あなたが持っているあなたのコード例では.... WebAppContextが要求を処理できない場合を意味

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

は、その後、RewriteHandlerは、それが要求を処理できるかどうかを確認するために実行されます。それ以外の場合は、がDefaultServletを使用するように設定されているため、これは起こりません。

単純な変更は、これはWebAppContextがさえ聞かれる前にRewriteHandlerはそのことを行うことができます

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

...ツリーはこのように見える変化を示唆しました。

注:このシナリオでも、コードに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 
+0

になります!ありがとう! – Melissa

関連する問題