Java Servlet过滤器未正常进入doFilter方法问题排查
嘿,不用急着搞web.xml哈!Servlet 3.0及以后的版本完全支持用@WebFilter注解配置过滤器,你遇到的过滤器没进入doFilter方法的问题,大概率是注解的配置细节没弄对,咱们一步步排查:
检查
urlPatterns是否匹配目标URL
这是最常见的坑!比如你要拦截/admin/*下的所有请求,结果写成了/admin(只能拦截单个路径),或者路径拼写错误。举个正确的例子:@WebFilter(urlPatterns = "/admin/*") public class AuthenticationFilter implements Filter { @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { HttpServletRequest req = (HttpServletRequest) request; HttpSession session = req.getSession(false); if (session == null || session.getAttribute("user") == null) { ((HttpServletResponse) response).sendRedirect("/login"); return; } chain.doFilter(request, response); } // 其他init、destroy方法按需实现 }如果要拦截多个路径,直接用数组:
urlPatterns = {"/user/*", "/order/*"}确认项目启用了Servlet注解扫描
如果你项目里已经存在极简的web.xml(比如只声明了Servlet版本),要检查有没有metadata-complete="true"属性——这个属性设为true会禁用容器对注解的扫描,改成false或者删掉就行:<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" version="3.1" metadata-complete="false"> <!-- 关键是这个属性 --> </web-app>如果根本没有web.xml,Tomcat 7+默认会自动扫描注解,除非你在Maven的打包配置里做了特殊限制。
检查过滤器类是否被容器扫描到
确保你的AuthenticationFilter类放在项目的源码目录下(比如src/main/java),而不是资源目录里。如果用了Spring框架,还要注意:@WebFilter是Servlet容器的注解,和Spring无关,如果要让Spring管理过滤器,需要额外加@Component,但单纯的Servlet过滤器只要在源码目录下就能被容器扫描到。确认
dispatcherTypes覆盖了你需要的请求类型
默认情况下,@WebFilter只拦截REQUEST类型的请求(也就是浏览器直接发起的请求),如果你的请求是通过forward转发过来的,过滤器不会触发。可以显式指定要拦截的请求类型:@WebFilter(urlPatterns = "/admin/*", dispatcherTypes = {DispatcherType.REQUEST, DispatcherType.FORWARD})检查Tomcat版本是否达标
必须用Tomcat 7.0及以上版本(对应Servlet 3.0+规范),低于这个版本的话,注解配置不生效,才需要用web.xml来配置过滤器。
先把这些点逐一排查一遍,基本就能解决过滤器不生效的问题啦,完全不需要额外创建web.xml。
内容的提问来源于stack exchange,提问作者kristheman

