2012-03-29 6 views
1

Ich habe Apache Tomcat Version 7.0.26 ausgeführt.Vorrang des Filters über Servlet in Tomcat

A habe ein JAX-RS-Servlet unter/test, das jsps aufruft, die in der Tourn von der Tomcat-Servlet-Engine behandelt werden sollten. B. /test sollte von Trikot behandelt werden, aber /test/result.jsp sollte von der JSP-Engine gehandhabt werden.

Ich möchte nicht, dass der Benutzer verschiedene URLs sehen, daher schreibe ich die JSP-URLs intern in/JSP um.

Config ist so:

UrlRewriteFilter (in urlrewrite.xml):

<rule> 
    <from>^/([^j][^s][^p].*\.jsp)</from> 
    <to>/jsp/$1</to> 
</rule> 

web.xml:

<filter> 
    <filter-name>UrlRewriteFilter</filter-name> 
    <filter-class>org.tuckey.web.filters.urlrewrite.UrlRewriteFilter</filter-class> 
    <!-- set the amount of seconds the conf file will be checked for reload 
    can be a valid integer (0 denotes check every time, 
     empty/not set denotes no reload check) --> 
    <init-param> 
    <param-name>confReloadCheckInterval</param-name> 
    <param-value>0</param-value> 
    </init-param> 
</filter> 
<filter-mapping> 
    <filter-name>UrlRewriteFilter</filter-name> 
    <url-pattern>/*</url-pattern> 
    <dispatcher>REQUEST</dispatcher> 
    <dispatcher>FORWARD</dispatcher> 
</filter-mapping> 

<servlet> 
    <servlet-name>Test</servlet-name> 
    <servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class> 
    <init-param> 
    <param-name>com.sun.jersey.config.property.packages</param-name> 
    <param-value>test</param-value> 
    </init-param> 
    <load-on-startup>1</load-on-startup> 
</servlet> 
<servlet-mapping> 
    <servlet-name>Test</servlet-name> 
    <url-pattern>/test/*</url-pattern> 
</servlet-mapping> 

Ein Aufruf von /xyz.jsp an /jsp/xyz.jsp umgeleitet. Ein Anruf an /test/xyz.jsp führt zu 404 - Servlet Test is not available. Ich dachte, dass Filter Vorrang vor Servlets haben, nicht wahr?

Ich bin mir der verwandten Frage Servlet vs Filter bewusst, aber sie geben nichts über den Vorrang.

BTW: PrettyFaces scheint zu UrlRewriteFilter ähnlich zu sein, aber ich habe es noch nicht ausprobiert. Ich (derzeit) mag UrlRewriteFilter mehr.

EDIT: Die Frage How to mix server-side Jax-rs call with native files without prefix? fragt die Frage hinter meiner Frage.

Antwort

1

Eigentlich können Sie es ganz einfach arbeiten lassen und Sie brauchen keine URL-Umschreibung. Platziere einfach deine JSPs in test/dir, registriere Jersey als Servlet-Filter anstelle eines Servlets (dh ersetze alle Vorkommen von Servlet durch Filter in deiner web.xml) und füge com.sun.jersey.config.feature hinzu. FilterForwardOn404 init param auf true gesetzt. Die resultierende web.xml sollte wie folgt aussehen:

<filter> 
    <filter-name>Test</filter-name> 
    <filter-class>com.sun.jersey.spi.container.servlet.ServletContainer</filter-class> 
    <init-param> 
    <param-name>com.sun.jersey.config.property.packages</param-name> 
    <param-value>test</param-value> 
    </init-param> 
    <init-param> 
    <param-name>com.sun.jersey.config.feature.FilterForwardOn404</param-name> 
    <param-value>true</param-value> 
    </init-param> 
</filter> 
<filter-mapping> 
    <filter-name>Test</filter-name> 
    <url-pattern>/test/*</url-pattern> 
</filter-mapping> 
+0

Funktioniert gut. Man muss darauf achten, die @ PATH-Direktive jedes Jersey-Filters anzupassen. – koppor

+0

In der Zwischenzeit gebe ich ein Viewable mit der JSP-Datei als Parameter zurück. Ich habe auch FilterForwardOn404 ausgeschaltet, weil bei normalem Code ein 404, der durch den Code erzeugt wird, auch zu einem Forward führt, was nicht immer wünschenswert ist (abhängig vom Setup). – koppor

+0

Kann eine Basis-URL mit Filter-Mapping angegeben werden? –

0

Es scheint, dass ein solches Setup nicht funktioniert. Alle Rest-Dienste unter /rest und allen Jsps unter /jsp zu platzieren, macht den Trick.

Verwandte Themen