doFilter没有被调用

时间:2010-09-07 14:40:42

标签: 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.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)

2 个答案:

答案 0 :(得分:25)

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

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

  2. 在链中之前运行的另一个过滤器没有调用FilterChain#doFilter(),而是RequestDispatcher#forward()include()导致链中的后续过滤器被完全跳过(当他们不听FORWARDINCLUDE调度员时;他们默认只监听REQUEST调度员。解决方法是修复错误的过滤器,或相应地添加<dispatcher>FORWARD</dispatcher>等,或重新安排web.xml中的过滤器声明,以便新的过滤器之前另一个过滤器(您反过来只需确保您的新过滤器正确使用FilterChain#doFilter() :)。

  3. 请求网址错误。您使用了http://localhost:8080/hello/world。使用过滤器监听/*,这意味着webapp上下文应该是ROOT或至少/hello。验证您的webapp上下文。我只是使用一个URL重试,该URL指向同一webapp中的有效JSP / Servlet,它生成非404响应。那么过滤器也会被调用吗?

答案 1 :(得分:0)

网页请求是什么样的?您可以尝试将网址格式更改为 *。jsp 而不是/ *吗?如果您使用的不是纯JSP,那么将其更改为请求结束扩展名(如struts通常为* .do)。