2013-01-21 8 views
10

Próbuję zaimplementować prostą regułę przepisywania w osadzonym serwerze Jetty, zgodnie z przykładami dokumentacji Jetty.Rozwiązania wbudowanego osadzania nie działają poprawnie

Chcę, aby żądania do /admin/ przepisywano na /admin.html. W tej chwili, jeśli poproszę o numer /admin/, pojawia się błąd 404 z nieznalezieniem /admin.html. Ale jeśli zgłoszę się bezpośrednio, to zadziała /admin.html!

Istnieją 2 inne podobne posty na stackoverflow, ale nie ma odpowiedzi na pytanie!

Oto kod:

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); 

Odpowiedz

16

Wymień 2 linie ...

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

z

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

To uczyni przepisy rewriter kopać przed normalnego obsługa kontekstu.

Pomyśl o obsłudze kontekstu jako drzewa. W przykładzie kodu masz ....

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

Oznacza to, że jeśli WebAppContext nie może obsłużyć żądania, wówczas RewriteHandler jest wykonywany w celu sprawdzenia, czy może on obsługiwać żądania. To się nigdy nie stanie, ponieważ WebAppContext jest skonfigurowany do używania DefaultServlet, jeśli nic innego nie pasuje.

Prosta zmiana proponowanych zmian drzewo wyglądać tak ...

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

To pozwoli RewriteHandler zrobić jego rzecz przed WebAppContext nawet zapytałem.

Uwaga: w tym scenariuszu można również zastosować nieco bardziej odpowiedni kod, niż HandlerCollection.

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

Spowoduje to w poniższym drzewie

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

To bardzo pomocne! Dzięki! – Melissa

Powiązane problemy