你能帮忙检查为什么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)
答案 0 :(得分:25)
在以下情况下不会调用过滤器:
类路径中缺少过滤器类和/或不可加载或可实例化。但是,您应该在服务器的启动日志中注意到它。可以根据服务器日志中发现的异常/错误的解释找到解决方案。
在链中之前运行的另一个过滤器没有调用FilterChain#doFilter()
,而是RequestDispatcher#forward()
或include()
导致链中的后续过滤器被完全跳过(当他们不听FORWARD
或INCLUDE
调度员时;他们默认只监听REQUEST
调度员。解决方法是修复错误的过滤器,或相应地添加<dispatcher>FORWARD</dispatcher>
等,或重新安排web.xml
中的过滤器声明,以便新的过滤器之前另一个过滤器(您反过来只需确保您的新过滤器正确使用FilterChain#doFilter()
:)。
请求网址错误。您使用了http://localhost:8080/hello/world。使用过滤器监听/*
,这意味着webapp上下文应该是ROOT或至少/hello
。验证您的webapp上下文。我只是使用一个URL重试,该URL指向同一webapp中的有效JSP / Servlet,它生成非404响应。那么过滤器也会被调用吗?
答案 1 :(得分:0)
网页请求是什么样的?您可以尝试将网址格式更改为 *。jsp 而不是/ *吗?如果您使用的不是纯JSP,那么将其更改为请求结束扩展名(如struts通常为* .do)。