Приоритет фильтра над сервлетом в Tomcat - PullRequest
1 голос
/ 29 марта 2012

У меня работает Apache Tomcat версии 7.0.26.

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

Например, /test должно обрабатываться джерси, но /test/result.jsp должно обрабатываться механизмом JSP.

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

Конфиг выглядит так:

UrlRewriteFilter 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>

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

Мне известен связанный вопрос Servlet vs Filter , но они ничего не говорят о приоритете.

Кстати: PrettyFaces похоже на UrlRewriteFilter, но я еще не пробовал.Мне (в настоящее время) больше нравится UrlRewriteFilter.

РЕДАКТИРОВАТЬ: Вопрос Как смешать вызов Jax-rs на стороне сервера с собственными файлами без префикса? задает вопрос, стоящий за моим вопросом.

Ответы [ 2 ]

1 голос
/ 29 марта 2012

На самом деле вы можете сделать это довольно легко, и вам не нужно переписывать URL.Просто поместите свой jsp в test / dir, зарегистрируйте Джерси в качестве фильтра сервлета вместо сервлета (т.е. замените все вхождения servlet на filter в вашем web.xml) и добавьте com.Параметр init sun.jersey.config.feature.FilterForwardOn404 имеет значение 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 голосов
/ 29 марта 2012

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

...