2012-04-04 18 views
1

Ich habe mehrere Filter in meiner Anwendung, mit einer im Wurzelbereich.Änderung des Scalatrafilterverhaltens

<filter> 
    <filter-name>root</filter-name> 
    <filter-class> 
     my.own.classpath.RootFilter 
    </filter-class> 
</filter> 

<filter> 
    <filter-name>root</filter-name> 
    <filter-class> 
     my.own.classpath.SubFilter 
    </filter-class> 
</filter> 

<filter-mapping> 
    <filter-name>root</filter-name> 
    <url-pattern>/</url-pattern> 
</filter-mapping> 

<filter-mapping> 
    <filter-name>sub</filter-name> 
    <url-pattern>/sub/*</url-pattern> 
</filter-mapping> 

In Scalatra 2.0.0 das hat gut funktioniert. Wenn RootFilter (die ScalatraFilter erweitert) eine Bindung für eine URL hatte, würde es damit umgehen, sonst würde es an die anderen Filter übergeben. In späteren Versionen von Scalatra funktioniert es jedoch nicht gleich. Wenn ich eine URL anschließe, die von SubFilter gehandhabt wird, wird der richtige Filter weiterhin aufgerufen aber der resultierende Text wird nicht angezeigt. Stattdessen wird eine leere Seite (ohne HTML) zurückgegeben.

Ist das ein Fehler in Scalatra, oder mache ich etwas falsch?

+1

, welche Version von Scalatra sind Sie? 2.10 entwickeln, 2.0.4 stabil oder etwas anderes? (liest sich wie eine aufgezeichnete Nachricht ;-)) – virtualeyes

+0

Meine Seite "funktioniert" auf Scalatra 2.0.0. Meine Seite "funktioniert nicht" auf Scalatra 2.0.1 und 2.0.4. Ich setze diese Sätze in Anführungszeichen, weil ich nicht sicher bin, ob ich einen Fehler oder eine Funktion ausnutze - obwohl ich denke, dass es letzteres ist. – schmmd

Antwort

1

Ich bin mir nicht sicher, Scalatra bewegt sich nicht mit Java-Tempo, so ändern sich die Dinge.

Hier ist ein Ausschnitt aus dem Scalatra Book v2.0 auf ScalatraServlet vs. ScalatraFilter; kann es hier einige Anhaltspunkt sein, wo das Problem liegt, insbesondere im Hinblick auf die nicht in der Kette zum nächsten Filter gefunden und ScalatraFilter Delegieren (in Ihrem Fall gibt es keinen nächsten Filter nach sub)

Der Haupt Differenz ist das Standardverhalten, wenn eine Route nicht gefunden wird. Ein ScaletraFilter delegiert an den nächsten Filter oder das nächste Servlet in der -Kette (wie von web.xml konfiguriert), während ein ScalatraServlet eine 404-Antwort zurückgibt.

Ein weiterer Unterschied ist, dass ScalatraFilter die Routen relativ zu des WAR-Kontextpfads abgleicht. ScalatraServlet stimmt mit Routen überein, die sich auf den Servlet-Pfad beziehen. Auf diese Weise können Sie mehrere Servlets unter verschiedenen Namespaces in demselben WAR bereitstellen.

Verwenden ScalatraFilter wenn:

You are migrating a legacy application inside the same URL space 
You want to serve static content from the WAR rather than a dedicated web server  

Verwenden ScalatraServlet wenn:

You want to match routes with a prefix deeper than the context path. 
+0

Ja, also der erste Teil schlägt vor, was ich tun soll (delegieren Sie zum nächsten Filter) und der zweite Teil schlägt vor, dass es nicht funktionieren sollte (Übereinstimmung tieferes Präfix). – schmmd

+0

;-) Ich liebe Scalatra, aber einige graben erforderlich, keiner der Betreuer wird bezahlt (direkt). Die Dokumentation ist gut, aber nicht großartig. IMHO, es ist das zugänglichste/am Boden laufende Scala-Mikro-Framework herum (Spray & Unfiltered haben die staatenlose REST-Nische gut abgedeckt, aber Scalatra im Allgemeinen geht aus dem Weg, gibt Ihnen Staat, wenn Sie es wollen, und ist super leicht in einen MVC Stack zu verwandeln). Wie auch immer, froh, dass ich Hilfe hatte! – virtualeyes

Verwandte Themen