Donnie

不积跬步无以至千里

SpringBoot添加过滤器和拦截器

过滤器和拦截器主要区别包括以下几个方面:
  1、Filter是依赖于Servlet容器,属于Servlet规范的一部分,而拦截器则是独立存在的,可以在任何情况下使用。
  2、Filter的执行由Servlet容器回调完成,而拦截器通常通过动态代理的方式来执行。
  3、Filter的生命周期由Servlet容器管理,而拦截器则可以通过IoC容器来管理,因此可以通过注入等方式来获取其他Bean的实例,因此使用会更方便。

过滤器实现

  1. 实现Filter类
  2. 添加WebFilter注解

    package com.donnie.Filter;
    
    import lombok.extern.slf4j.Slf4j;
    
    import javax.servlet.*;
    import javax.servlet.annotation.WebFilter;
    import java.io.IOException;
    
        //urlPatterns过滤需要过滤的接口
    @WebFilter(urlPatterns = "/*", filterName = "ProfileFilter")
    @Slf4j
    public class ProfileFilter implements Filter {
    
        @Override
        public void init(FilterConfig filterConfig) throws ServletException {
    
        }
    
        @Override
        public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
            long start = System.currentTimeMillis();
            filterChain.doFilter(servletRequest, servletResponse);
            log.info("请求响应时间为 : " + (System.currentTimeMillis() - start)+"ms");
        }
    
        @Override
        public void destroy() {
    
        }
    }


  1. 在springboot启动类上添加 @ServletComponentScan("com.donnie.Filter")

@SpringBootApplication
@ServletComponentScan("com.donnie.Filter")
public class MycatDemoApplication {

    public static void main(String[] args) {
        SpringApplication.run(MycatDemoApplication.class, args);
    }

}

拦截器实现

1.实现HandlerInterceptor接口
2.添加@Component 注解


    /**
     * 拦截请求,获取判断租户和写入ThreadLocal
     */
    @Component
    @Slf4j
    public class UserInterceptor implements HandlerInterceptor {
    
        @Override
        public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
            // 一般不可能是传参数的,这里只做演示
            // 但可以判断用户登陆的session,或cookies,或二级域名识别是哪个租户
            String tenantId = request.getParameter("tenantId");
            log.info("preHandle---->>"+tenantId);
    
            if (tenantId != null && tenantId.length() > 0) {
                MultiTenantHolder.setCurrentNode("dn" + tenantId);
            }
            return true;
        }
    
    
    
        @Override
        public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
            MultiTenantHolder.remove();
            log.info("afterCompletion---->>");
        }
    
        @Override
        public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
            log.info("postHandle---->>");
        }
    }

3.实现WebMvcConfigurer接口
4.添加@Configuration注解
5.添加拦截器


    @Configuration
    public class WebConfigurer implements WebMvcConfigurer {
    
        @Autowired
        UserInterceptor userInterceptor;
    
        @Override
        public void addInterceptors(InterceptorRegistry registry) {
            // addPathPatterns("/**") 表示拦截所有的请求,
            // excludePathPatterns("/login", "/register") 表示除了登陆与注册之外,因为登陆注册不需要登陆也可以访问
            registry.addInterceptor(userInterceptor)
                    .addPathPatterns("/**")
                    .excludePathPatterns("/login", "/register");
        }
    }

赞赏支持