Tomcat中过滤器优先于servlet的优先级

时间:2012-03-29 08:21:43

标签: tomcat url-rewriting jersey tuckey-urlrewrite-filter

我正在运行Apache Tomcat V7.0.26。

在/ test下有一个JAX-RS servlet,它调用jsps,在tourn中应该由Tomcat servlet引擎处理。

如, /test应由jersey处理,但/test/result.jsp应由JSP引擎处理。

我不希望用户看到不同的网址,因此,我在内部将jsp网址重写为/ jsp。

Config就是这样:

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,不是吗?

我知道相关问题Servlet vs Filter,但他们没有说明优先顺序。

BTW:PrettyFaces似乎与UrlRewriteFilter类似,但我还没有尝试过。我(目前)更喜欢UrlRewriteFilter。

编辑:问题How to mix server-side Jax-rs call with native files without prefix?询问我的问题背后的问题。

2 个答案:

答案 0 :(得分:1)

实际上,你可以很容易地使它工作,你不需要任何网址重写。只需将您的jsp放入test / dir,将Jersey注册为servlet过滤器而不是servlet(即将所有出现的 servlet 替换为web.xml中的过滤器)并添加com.sun.jersey.config.feature.FilterForwardOn404 init param设置为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>

答案 1 :(得分:0)

似乎这样的设置不起作用。将所有休息服务放在/rest以及/jsp下的所有jsps处理都可以。