tomcat - 过滤器在 Tomcat 中优先于 servlet

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

我正在运行 Apache Tomcat 版本 7.0.26。

A 在/test 下有一个 JAX-RS servlet,它调用 jsps,而后者又应该由 Tomcat servlet 引擎处理。

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

我不希望用户看到不同的 url,因此,我在内部将 jsp url 重写为/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 测试不可用。我认为过滤器优先于 servlet,不是吗?

我知道相关问题 Servlet vs Filter , 但他们没有说明任何关于优先级的事情。

顺便说一句:PrettyFaces好像和UrlRewriteFilter类似,不过我还没试过。我(目前)更喜欢 UrlRewriteFilter。

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

最佳答案

实际上你可以很容易地让它工作,你不需要任何 url 重写。只需将您的 jsp 放入 test/目录,将 Jersey 注册为 servlet 过滤器而不是 servlet(即在您的 web.xml 中将所有出现的 servlet 替换为 filter )并添加com.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>

关于tomcat - 过滤器在 Tomcat 中优先于 servlet,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9921630/

相关文章:

java - REST 应用程序在 Eclipse 中运行,但不是作为可执行 jar。 NoClassDefFound错误: javax/xml/bind/annotation/XmlElement

tomcat - tomcat 7 上的 Spring MVC 为没有路径的请求提供 HTTP 405

java - 在 Tomcat servlet 中处理重复的 GET 请求(由 Trendmicro 引起)

ruby - nginx + passenger 上的多个 Rack 应用程序,一个作为 root,另一个不是...配置帮助

JSF URL 重写

java - jersey-spring 和 jenkins - 读取 zip 文件/jersey-core-1.8.jar 时出现奇怪错误

java - Jersey 。如何根据url参数生成json和xml输出

java - 如何防止 jar 在构建过程中多次编译

java - Tomcat 错误 : java. io.IOException:服务器为 URL 返回 HTTP 响应代码:405:

nginx - 带有尾部斜杠的奇怪 Nginx 行为