• FilterRegistrationBean能不能排除指定url


    什么是FilterRegistrationBean

    FilterRegistrationBean是Spring框架中的一个重要组件,它的作用是注册和管理过滤器。在Web应用程序中,过滤器是用于拦截HTTP请求和响应的组件。FilterRegistrationBean可以通过Java代码配置,也可以通过XML配置文件进行配置。

    FilterRegistrationBean的工作原理是在Spring应用程序启动时,自动扫描并注册所有配置的过滤器。这些过滤器可以拦截HTTP请求和响应,并执行一些预定义的操作。例如,过滤器可以检查请求参数、修改请求头、记录请求日志等。

    FilterRegistrationBean的使用非常灵活,可以根据具体的需求进行配置。例如,可以指定过滤器的名称、URL模式、执行顺序等。

    举个栗子

    上篇文章针对全局日志的文章https://blog.51cto.com/u_16174475/7335078
    针对全局的日志traceId处理,就使用了FilterRegistrationBean注册LogFilter

    package com.study.springbootplus.config;
    
    import com.study.springbootplus.utils.ThreadMdcUtil;
    import org.slf4j.MDC;
    import org.springframework.web.filter.OncePerRequestFilter;
    
    import javax.servlet.FilterChain;
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import java.io.IOException;
    
    public class LogFilter extends OncePerRequestFilter {
    
        @Override
        protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
            ThreadMdcUtil.setTraceIdIfAbsent();
            try {
                filterChain.doFilter(request, response);
            } finally {
                response.addHeader(ThreadMdcUtil.TRACE_ID, MDC.get(ThreadMdcUtil.TRACE_ID));
                ThreadMdcUtil.remove();
            }
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    @Configuration
    public class WebMvcConfig implements WebMvcConfigurer {
    
      @Bean
      public FilterRegistrationBean logFilter() {
        FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean();
        filterRegistrationBean.setFilter(new LogFilter());
        filterRegistrationBean.setOrder(Integer.MIN_VALUE);
        return filterRegistrationBean;
      }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    FilterRegistrationBean还支持许多其他属性。例如,可以指定过滤器的初始化参数、异步支持、servlet名称等。以下是一些常用的属性:

    • filter:指定要注册的过滤器实例。
    • urlPatterns:指定过滤器要拦截的URL模式。
    • name:指定过滤器的名称。
    • order:指定过滤器的执行顺序。
    • initParameters:指定过滤器的初始化参数。
    • asyncSupported:指定是否支持异步操作。
    • servletNames:指定要拦截的Servlet名称。

    但是如果我想要排除某些uri

    有些filter想要排除部分uri,使用FilterRegistrationBean 该怎么操作呢?
    FilterRegistrationBean 里面的方法比如addUrlPatterns,只能用来指定uri,并没有其他方法来进行过滤uri,所以只能在继承OncePerRequestFilter的LogFilter里面实现

    方法

    OncePerRequestFilter有个shouldNotFilter方法,用来排除uri,如果需要排除的uri是固定的话就只需要在方法里面加上排除的uri:

       @Override
        protected boolean shouldNotFilter(HttpServletRequest request) {
            String requestURI = request.getRequestURI();
            return requestURI.startsWith("/actuator")
                    || requestURI.startsWith("/captcha");
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    如果是多个项目使用,不同项目需要指定不同url,那就可以在LogFilter定义一个List,然后在初始化的时候set需要过滤的uri就可以:

    package com.study.springbootplus.config;
    
    import com.google.common.collect.Lists;
    import com.study.springbootplus.utils.ThreadMdcUtil;
    import org.slf4j.MDC;
    import org.springframework.web.filter.OncePerRequestFilter;
    
    import javax.servlet.FilterChain;
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import java.io.IOException;
    import java.util.List;
    
    public class LogFilter extends OncePerRequestFilter {
    
        private static List<String> excludes = Lists.newArrayList();
    
        public static void setExcludes(List<String> excludes) {
            LogFilter.excludes = excludes;
        }
    
        @Override
        protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
            ThreadMdcUtil.setTraceIdIfAbsent();
            try {
                filterChain.doFilter(request, response);
            } finally {
                response.addHeader(ThreadMdcUtil.TRACE_ID, MDC.get(ThreadMdcUtil.TRACE_ID));
                ThreadMdcUtil.remove();
            }
        }
    
        @Override
        protected boolean shouldNotFilter(HttpServletRequest request) {
            return excludes.contains(request.getRequestURI());
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39

    在使用的地方:

        @Bean
        public FilterRegistrationBean logFilter() {
            FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean();
            LogFilter logFilter = new LogFilter();
            logFilter.setExcludes(Lists.newArrayList("/aaa", "/bb"));
            filterRegistrationBean.setFilter(logFilter);
            filterRegistrationBean.setOrder(Integer.MIN_VALUE);
            return filterRegistrationBean;
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    总结FilterRegistrationBean只能设置指定的url进行过滤,而不能指定排除uri,只能使用OncePerRequestFilter的shouldNotFilter方法,排除uri

  • 相关阅读:
    Compose和AndroidView的交互
    第1章 数据结构绪论
    必须使用串口擦除Flash后才能继续连接,另外使用串口3进行通讯时,整合后串口负责的ES8266-01S连接阿里云平台的相关代码也处于崩溃状态,请问这两者之间有没有直接联系,如何解决?
    springboot集成hystrix和feign,解决fallback,fallbackFactory不生效问题
    喜大普奔!有软考电子版证书可以正式办理广州落户了!
    从零开始搭建Vue2.0项目(一)之快速开始
    Github全封41万俄罗斯开发者账号,开源真的无国界
    gitea的简单介绍
    《人生七年》纪录片中问的问题
    LeetCode --- 1450. Number of Students Doing Homework at a Given Time 解题报告
  • 原文地址:https://blog.csdn.net/qq_38366063/article/details/133846261