Servlet过滤器无法正常运行

时间:2020-02-27 00:54:27

标签: java servlet-filters

经过一些研究和试验错误,我发现一个method允许我以编程方式添加servlet过滤器,同时根据需要保留它们的顺序,而无需使用web.xml和注释。根据找到的方法,过滤器无法正常运行,因为据我所知,它由picture in this thread表示。从我的日志来看,过滤链调用的步骤5、6和7从未执行过。

在成功启动Web应用程序上下文时:

GodFilter.init
Filter1.init
Filter2.init
...
FilterFinal.init

浏览网络应用程序时:

GodFilter.doFilter
Filter1.doFilter
GodFilterChain.doFilter
Filter2.doFilter
GodFilterChain.doFilter
...
FilterFinal.dofilter
MyServlet.service(ServletRequest request, ServletResponse response)
MyServlet.service(HttpServletRequest request, HttpServletResponse response)
MyServlet.getLastModified
MyServlet.doGet

至少,我希望在GodFilter.doFilter之后看到MyServlet.doGet(按照过滤链调用的步骤5、6和7),但它不会出现。我是否缺少某些东西或误解了servlet过滤器链的工作方式? GodFilter类不正确吗?

TIA!

[编辑1]

我忘了提到GodFilter是通过实现ServletContainerInitializer的类加载的:

FilterRegistration fr = context.addFilter(GodFilter.class.getSimpleName(), GodFilter.class);
fr.addMappingForUrlPatterns(EnumSet.of( //
        DispatcherType.ASYNC, //
        DispatcherType.ERROR, //
        DispatcherType.FORWARD, //
        DispatcherType.INCLUDE, //
        DispatcherType.REQUEST), false, "/*");
fr.setInitParameter("param1", "value1");

我也尝试将isMatchedAfter设置为true,但没有更改。

1 个答案:

答案 0 :(得分:1)

查看了更多有关过滤器的代码后,我发现在chain.doFilter(request, response)中遗漏了Filter.doFilter后处理的关键部分:

Filter1.doFilter(ServletRequest request, ServletResponse response, FilterChain chain) {
    // pre chain processing 

    // if filter is last in filter chain, then mapped servlet will process hereafter
    chain.doFilter(request, response);

    // post chain processing
}