2013-01-21 9 views
10

Ich versuche, eine einfache Rewrite-Regel in einem eingebetteten Jetty-Server zu implementieren, die den Jetty-Dokumentationsbeispielen folgt.Embedded Jetty schreibt nicht mehr richtig

Ich möchte Anfragen an /admin/ in /admin.html umschreiben. Im Moment, wenn ich Anfrage /admin/ erhalte ich einen 404 Fehler mit /admin.html nicht gefunden. Aber wenn ich direkt /admin.html anfordern, funktioniert es!

Es gibt 2 weitere ähnliche Beiträge auf stackoverflow, aber keine Antworten auf die Frage!

Hier ist der Code:

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

Antwort

16

Ersetzen Sie die 2 Zeilen ...

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

mit

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

dass die rewriter Regeln treten in vor der normalen machen Kontextverarbeitung.

Denken Sie an die Kontextbehandlung als Baum. In Ihrem Beispiel Code, den Sie haben ....

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

Das heißt, wenn die WebAppContext die Anforderung nicht verarbeiten kann, dann wird die RewriteHandler ausgeführt, um zu sehen, ob er die Anforderung verarbeiten kann. Das wird nie passieren, da WebAppContext so eingestellt ist, dass DefaultServlet verwendet wird, wenn nichts anderes passt.

Die einfache Änderung vorgeschlagenen Änderungen den Baum wie folgt aussehen ...

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

Dies ermöglicht es dem RewriteHandler seine Sache zu tun, bevor die WebAppContext sogar gefragt.

Hinweis: Sie können auch Ihren Code die HandlerCollection ein bisschen mehr für dieses Szenario verwenden.

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

Dies führt in der folgenden Baum

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

, die sehr hilfreich ist! Vielen Dank! – Melissa