我正在运行 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/