Java doFilter没有被调用

Java doFilter没有被调用,java,servlets,servlet-filters,Java,Servlets,Servlet Filters,你能帮我查一下为什么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.xs

你能帮我查一下为什么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>
调用时返回404,我将断点设置为
doFilter,似乎没有调用doFilter?(我尝试了tomcat 6.0.18、6.0.29、jdk1.6)

web请求是什么样子的?您能否尝试将url模式改为*.jsp而不是/*?如果您使用的不是纯JSP,则将其更改为请求结束扩展名的任何内容(如struts,它通常为*.do)。

在以下情况下,将不会调用过滤器:

  • 类路径中缺少筛选器类和/或不可加载或实例化。但是,您应该在服务器的启动日志中注意到它。根据对服务器日志中发现的异常/错误的解释,找到解决方案

  • 链中之前运行的另一个筛选器没有调用,而是导致链中的后续筛选器被完全跳过(当它们不侦听
    转发
    包含
    调度程序时;默认情况下,它们只侦听
    请求
    调度程序)。解决方案是修复错误的筛选器,或者相应地添加
    转发
    等,或者重新排列
    web.xml
    中的筛选器声明,以便新筛选器位于另一个筛选器之前(您只需确保新筛选器正确使用
    FilterChain#doFilter()

  • 请求URL完全错误。你用过。如果过滤器侦听
    /*
    ,这意味着webapp上下文应该是ROOT或至少是
    /hello
    。验证您的webapp上下文。我只需使用一个URL重试,该URL指向同一webapp中的有效JSP/Servlet,该webapp生成一个非404响应。过滤器是否也会被调用


  • /hello/world
    是否解析为服务器的资源?如果没有,就没有理由启动一个过滤链。我很确定我自己以前也遇到过这个问题,因为
    /*
    模式不起作用。我想我从来没有解决过它。@rsp:资源不一定需要是一个物理现有资源。无论如何都会调用映射到
    /*
    上的过滤器(和servlet)。它也可以充当前端控制器。@BalusC,当路径没有匹配servlet或其他非筛选器资源时,是否启动筛选器链?web.xml只指定一个侦听器和一个筛选器,而不指定其他内容。@rsp:当然可以。否则,基于过滤器(MVC)的框架(如Spring(MVC))将无法工作。由于正确调用了initFilterBean,所以Filter类很好。我检查了destroy()API:只有当过滤器的doFilter方法中的所有线程都退出或超过超时时间后,才会调用此方法。也许是超时?我添加了第三个原因(这毕竟是很明显的,但你永远不知道:)。我也这么认为。正如我在回答中所说的,他的过滤器可能设置在错误的URL上。@Coolbeans:但是你的回答没有这样解释,而是提出了一个有点奇怪的解决方案。
    import org.springframework.web.filter.GenericFilterBean;
    public class RoseFilter extends GenericFilterBean {