2012-03-29 3 views
1

У меня есть версия Apache Tomcat версии 7.0.26.Приоритет фильтра над сервлетом в Tomcat

A есть сервлет JAX-RS под/test, который вызывает jsps, который в турнире должен обрабатываться движком сервлетов Tomcat.

E-mail: /test должен быть обработан джерси, но /test/result.jsp должен обрабатываться двигателем JSP.

Я не хочу, чтобы пользователь видел разные URL-адреса, поэтому я переписываю URL-адреса jsp в/jsp внутренне.

Конфигурация такова:

UrlRewriteFilterurlrewrite.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> 

Вызов /xyz.jsp перенаправляется /jsp/xyz.jsp. Вызов /test/xyz.jsp приводит к 404 - Servlet Test is not available. Я думал, что фильтры имеют приоритет над сервлетами, не так ли?

Мне известно о соответствующем вопросе Servlet vs Filter, но они ничего не говорят о приоритете.

BTW: PrettyFaces похоже, похоже на UrlRewriteFilter, но я еще не пробовал его. Я (в настоящее время), например, UrlRewriteFilter.

EDIT: вопрос How to mix server-side Jax-rs call with native files without prefix? задает вопрос позади моего вопроса.

ответ

1

На самом деле вы можете заставить его работать довольно легко, и вам не нужно переписывать URL. Просто поместите ваш jsp в test/dir, зарегистрируйте Джерси в качестве фильтра сервлетов вместо сервлета (т.е. замените все вхождениясервлетом с фильтром в ваш web.xml) и добавьте com.sun.jersey.config.feature. Значение параметра FilterForwardOn404 init равно true. Полученный web.xml должен выглядеть следующим образом:

<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

Отлично работает. Нужно обратить внимание на адаптацию директивы '@ PATH' каждого фильтра Джерси. – koppor

+0

Между тем, я возвращаю Viewable с файлом jsp в качестве параметра. Я также отключил FilterForwardOn404, потому что с нормальным кодом 404, созданный кодом, также приводит к переходу, что не всегда желательно (в зависимости от настройки). – koppor

+0

Может ли базовый url указываться с помощью фильтрации фильтров? –

0

Похоже, что такая настройка не работает. Размещение всех остальных сервисов unter /rest и всех jsps под /jsp делает трюк.

Смежные вопросы