doFilter方法未被调用

11

您可以帮忙检查一下为什么 doFilter 没有被调用吗?

web.xml:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"    xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
<context-param>
<param-name>log4jConfigLocation</param-name>
<param-value>/WEB-INF/log4j.properties</param-value>
</context-param>
<listener>
    <listener-class>org.springframework.web.util.Log4jConfigListener</listener-class>
</listener>
<filter>
<filter-name>roseFilter</filter-name>
<filter-class>net.paoding.rose.RoseFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>roseFilter</filter-name>
<url-pattern>/*</url-pattern>
<dispatcher>REQUEST</dispatcher>
<dispatcher>FORWARD</dispatcher>
<dispatcher>INCLUDE</dispatcher>
</filter-mapping>
</web-app>
import org.springframework.web.filter.GenericFilterBean;
public class RoseFilter extends GenericFilterBean {

当调用 http://localhost:8080/hello/world 返回404错误,我在doFilter处设置了断点,但是似乎没有调用doFilter?(我试过tomcat 6.0.18、6.0.29和jdk1.6)


1
/hello/world 是否在您的服务器上解析为资源?如果不是,则没有理由启动过滤器链。 - rsp
2
我相当确定我之前也遇到过这个问题,使用 /* 模式无法正常工作。我认为我从未解决过它。 - skaffman
@rsp:资源不一定需要是一个实际存在的资源。映射在 /* 上的过滤器(和servlet)将被调用。它可能会充当前端控制器。 - BalusC
@BalusC,当路径没有匹配到任何servlet或其他非过滤器资源时,过滤器链是否会启动?web.xml文件中只指定了一个监听器和一个过滤器,没有其他内容。 - rsp
@rsp:当然可以。否则像Spring(MVC)这样基于过滤器的框架就永远不会起作用了。 - BalusC
2个回答

27

当以下情况发生时,过滤器将不会被调用:

  1. 过滤器类在类路径中不存在,或者无法加载或实例化。您应该已经在服务器的启动日志中注意到了这一点。解决方案应基于服务器日志中发现的异常/错误的解释。

  2. 在过滤器链中先于当前过滤器运行的另一个过滤器未调用 FilterChain#doFilter(),而是调用了 RequestDispatcher#forward() 或者 include(),导致后续的过滤器被完全跳过(除非它们侦听 FORWARDINCLUDE 转发器;它们默认仅侦听 REQUEST 转发器)。解决方案是修复错误的过滤器,或相应地添加 <dispatcher>FORWARD</dispatcher>等内容,或重新排列 web.xml 中的过滤器声明,使您的新过滤器位于另一个过滤器之前(您只需要确保您的新过滤器正确使用 FilterChain#doFilter() 即可 :))。

  • 请求的URL是错误的。你使用了http://localhost:8080/hello/world。如果有一个监听/*的过滤器,这意味着web应用程序的上下文应该是ROOT或至少是/hello。请验证你的web应用程序上下文。我建议你重试一个指向同一Web应用程序内生成非404响应的有效JSP / Servlet的URL。那么这个过滤器是否也被调用了?


  • Filter类很好,因为initFilterBean被正确调用。 - e.b.white
    我添加了第三个原因(虽然这很明显,但你永远不知道 :))。 - BalusC
    我也这样认为BalusC。正如我在回复中所说,他的过滤器可能设置在错误的URL上了。 - CoolBeans
    @Coolbeans:你的回答并没有以那种方式解释,而且提出了一个有点奇怪的解决方案。 - BalusC
    谢谢 - 我遇到了同样的问题,将 <dispatcher>FORWARD</dispatcher> 添加到 filter-mapping 中解决了我的问题! - lukass77
    显示剩余4条评论

    0

    网页请求是什么样子的?你可以尝试将url-pattern更改为*.jsp而不是/ *吗?如果你使用的不是纯JSP,则将其更改为请求结束扩展名(例如,对于struts,通常是*.do)。


    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接