【问题标题】:doFilter not getting calleddoFilter 没有被调用
【发布时间】:2011-04-09 05:59:51
【问题描述】:

你能帮忙检查一下为什么 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)

【问题讨论】:

  • /hello/world 是否解析为您的服务器的资源?如果没有,则没有理由启动过滤器链。
  • 我很确定我自己以前也遇到过这种情况,/* 模式不起作用。我想我从来没有解决过它。
  • @rsp:资源不一定是物理现有资源。无论如何都会调用映射在/* 上的过滤器(和 servlet)。它可能即充当前端控制器。
  • @BalusC,当路径没有匹配到servlet或其他非过滤器资源时,过滤器链是否启动? web.xml 只指定了一个监听器和一个过滤器,没有别的。
  • @rsp:当然可以。否则像 Spring (MVC) 这样的基于过滤器 (MVC) 的框架将永远无法工作。

标签: java servlets servlet-filters


【解决方案1】:

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

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

  2. 链中之前运行的另一个过滤器不是调用FilterChain#doFilter(),而是调用RequestDispatcher#forward()include(),这导致链中的后续过滤器被完全跳过(当它们不监听时) FORWARDINCLUDE 调度程序;默认情况下,它们仅侦听 REQUEST 调度程序)。解决方案是修复错误的过滤器,或者相应地添加&lt;dispatcher&gt;FORWARD&lt;/dispatcher&gt; 等,或者重新排列web.xml 中的过滤器声明,以便您的新过滤器另一个过滤器之前(您反过来只需要确保您的新过滤器正确使用FilterChain#doFilter() :) )。

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

【讨论】:

  • 1.过滤器类很好,因为 initFilterBean 被正确调用。
  • 我检查了 destroy() API:只有在过滤器的 doFilter 方法中的所有线程都退出或经过超时时间后才调用此方法。也许是超时了?
  • 我添加了第三个原因(这毕竟很明显,但你永远不知道:))。
  • 我也这么认为 BalusC。正如我在回复中所说,他的过滤器可能设置在错误的 URL 上。
  • @Coolbeans:您的回答并没有这样解释,而是提出了一个有点奇怪的解决方案。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-07-19
    • 1970-01-01
    • 1970-01-01
    • 2014-11-21
    • 1970-01-01
    • 2012-09-22
    • 2014-02-14
    • 2011-11-15
    相关资源
    最近更新 更多