springboot的@webFilter设置urlPatterns无效

返回
Author Avatar
钢翼
2021-02-08
编程
152

过滤器是springboot常用的框架处理利器。
但是当过滤器多起来的时候,用@Bean注入明显不够优雅。
直接在注解上写是不是更美观呢。
1.过滤器上注解添加@WebFilter,并且不要添加@Component和@Configuration等注解,否则他们注入顺序会比@WebFilter先,导致urlPatterns不起效。

@WebFilter(urlPatterns = "/api/**")
@Order(-101)
public class MyFilter implements Filter {
    .......
}

2.在启动类上添加@ServletComponentScan

@ServletComponentScan 
@SpringBootApplication
public class Application {
    ......
}

3.过滤器的拦截顺序可以通过@Order控制。
如果你的框架集成了spring security,并且通过spring security添加了鉴权用的过滤器。
当你想让你自定义的过滤器执行优先级更高,你不得不设置@Order小于-100.

重要!以上方法最终还是被我废弃了,当有些过滤器是@WebFilter有些是@Component时,会导致@WebFilter过滤器整个不起效。

我最后还是使用@Component的方式添加过滤器,并且在方法内判断url来实现urlPatterns

@Component
@Order(-101)
public class MyFilter implements Filter {
    @Override
    public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {

        HttpServletRequest request = (HttpServletRequest) req;
        HttpServletResponse response = (HttpServletResponse) res;
        AntPathMatcher matcher = new AntPathMatcher();
        if (!matcher.match("/api/**", request.getRequestURI())) {
            //不匹配则不拦截
            chain.doFilter(req, res);
            return;
        }
        ......
    }
}