java - Servlet 过滤器无法正常工作
问题描述
经过一些研究和试错后,我找到了一种方法,可以让我以编程方式添加 servlet 过滤器,同时根据需要保留它们的顺序,而无需使用 web.xml 和注释。根据找到的方法,过滤器无法正常工作,正如我所理解的那样,此线程中的图片代表了它。从我的日志中,过滤器链调用的步骤 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
(根据过滤器链调用的第 5、6 和 7 步),MyServlet.doGet
但它没有出现。我是否遗漏了什么或误解了 servlet 过滤器链的工作原理?GodFilter
类不正确吗?
蒂亚!
[编辑 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
,但没有改变。
解决方案
在查看了更多过滤器代码后,我发现我遗漏了后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
}
推荐阅读
- javascript - 添加和删除数组
- javascript - Moment.js DST 转换
- c++ - 具有两个关系运算符的单个变量如何在内部工作
- json - 用于 Elasticsearch 的 logstash 过滤器插件是什么?
- sql - SQL 按详细信息和月份聚合事务
- google-data-studio - 模仿 Matplotlib 的“缩放到矩形”功能
- python - Python SSL 错误握手
- c# - C# asp.net 4 尝试检查会话是否为空,并出现错误
- c# - 如何在 C# 中使用 Selenium 从 Chrome 下载 PDF
- ssis - SSIS - 当目标是钱时,OLE DB 连接管理器正在截断数值