首页 > 其他分享 >SpringBoot中定义Filter的三种方式

SpringBoot中定义Filter的三种方式

时间:2024-04-08 21:46:07浏览次数:9  
标签:SpringBoot requestURI request Filter 三种 FilterRegistrationBean public ServletCon

第一种方式

@Configuration
public class FilterConfig {

    @Bean
    public FilterRegistrationBean<LogFilter> paramsFilter() {
        FilterRegistrationBean<LogFilter> registration = new FilterRegistrationBean();
        registration.setFilter(new LogFilter());
        registration.addUrlPatterns("/*");
        registration.setName("logFilter");
        return registration;
    }

    public static class LogFilter extends OncePerRequestFilter {
        @Override
        protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
            String requestURI = request.getRequestURI();
            System.out.println("LogFilter requestURI: " + requestURI);
            filterChain.doFilter(request, response);
        }
    }
}

将 Filter 包装为 FilterRegistrationBean,并注册到 Spring 中。

简单原理分析

  1. ServletContextInitializerBeans 实例化时,从 Bean 容器中查找类型为 ServletContextInitializer 的所有 bean,包含 Servlet,Filter,Listener。我们定义的 FilterRegistrationBean 就是实现 ServletContextInitializer 这个接口的。
  2. TomcatServletWebServerFactory 得到 ServletContextInitializer 列表,在 getWebServer() 方法时传给 TomcatStarter 对象。
  3. TomcatStarter 是一个 ServletContainerInitializer,这是 servlet3.0 提供的一种扩展方式,会在 StandardContext 启动时调用 ServletContainerInitializer 的 onStartup() 方法。
  4. TomcatStarter 的 onStartup() 方法会依次调用 ServletContextInitializer 的 onStartup() 方法,ServletContextInitializer 可以看作是 Spring 提供的一种扩展方式。
  5. ServletContextInitializer 的 onStartup() 方法就会创建Servlet,Filter,Listener。底层调用 ServletContext 的 addServlet(),addFilter(),addListener() 方法,这样我们的 Servlet 或 Filter 就添加到 Tomcat 中了。

第二种方式

@ServletComponentScan
@Configuration
public class FilterConfig2 {

    @WebFilter(urlPatterns = "/*")
    public static class LogFilter2 extends OncePerRequestFilter {
        @Override
        protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
            String requestURI = request.getRequestURI();
            System.out.println("LogFilter2 requestURI: " + requestURI);
            filterChain.doFilter(request, response);
        }
    }
}

@WebFilter 注解和 @ServletComponentScan 注解配合使用。

  1. @ServletComponentScan 注解会自动配置 ServletComponentScanRegistrar,它又会配置 ServletComponentRegisteringPostProcessor。
  2. ServletComponentRegisteringPostProcessor 是一个 BeanFactory 后置处理器,它会扫描所有包含 WebServlet,WebFilter,WebListener注解的类。
  3. 以 WebFilterHandler 为例,它会将 包含 WebFilter 注解的类包装为 FilterRegistrationBean,注册到 Spring 容器中。
  4. 后续原理就和第一种方式一样了。

第三种方式

@Configuration
public class FilterConfig3 {

    @Component
    public static class LogFilter3 extends OncePerRequestFilter {
        @Override
        protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
            String requestURI = request.getRequestURI();
            System.out.println("LogFilter3 requestURI: " + requestURI);
            filterChain.doFilter(request, response);
        }
    }
}

直接将 Filter 注册为 Bean。这种方式不能指定 Filter 的 urlPattern,固定为 /*。

  1. ServletContextInitializerBeans 在实例化时,不仅会查找类型为 ServletContextInitializer 的所有 bean,还会查找 类型为 Servlet,Filter 的所有 bean,将其转换为 ServletRegistrationBean,FilterRegistrationBean。
  2. 后续原理和第一种方式一样。

总结

3种方式本质上都是包装为 ServletRegistrationBean 或 FilterRegistrationBean,然后注册到 Tomcat 中,第二,第三种方式可以看作第一种方式的变种。

标签:SpringBoot,requestURI,request,Filter,三种,FilterRegistrationBean,public,ServletCon
From: https://www.cnblogs.com/strongmore/p/18049570

相关文章

  • 校园台球厅人员与设备管理系统的设计与实现|SpringBoot+ Mysql+Java+ B/S结构(可运行
    本项目包含可运行源码+数据库+LW,文末可获取本项目的所有资料。推荐阅读300套最新项目持续更新中.....最新ssm+java项目文档+视频演示+可运行源码分享最新jsp+java项目文档+视频演示+可运行源码分享最新SpringBoot项目文档+视频演示+可运行源码分享2024年56套包含java,ssm......
  • 使用腾讯云Kubernetes部署SpringBoot项目
    使用流程创建集群创建Serverless类型的kubernetes集群(更加简单),不需要集群管理费用,但创建容器还是收费的。创建容器要确保当前账号有充足的余额在创建过程中,主要选择镜像,可以从自己的镜像仓库(需要先将自己的SpringBoot项目创建docker镜像并推送到远程仓库),或者Docker公共......
  • 2024年最新显卡天梯图来了!三种性能测试显卡排行榜
    2024年最新显卡天梯图来了!本次带来的显卡性能测试主要利用TimeSpy、TimeSpyExtreme、PortRoyal三种不同测试方法来展现最新显卡性能情况,有了显卡天梯图我们可以实时了解显卡市场,选择适合自己需求的显卡,对于不懂显卡性能的用户显卡天梯图无疑是最好入门和理解的。2024年最新......
  • 06-SpringBootWeb快速入门
        ......
  • Springboot + mybatis-plus项目
    作为小白第一次做了一个Springboot+mybatis-plus的demo总结和分享一下心得。 在Plugins里面下载mybatisX搭建srping初始环境<!--使用mybatis-plus需要导入的依赖:--><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</ar......
  • 在springboot项目中上传文件
    在springboot项目中上传文件需要用到FlieUtil工具类:publicclassFileUtil{ publicstaticbyte[]FileToByte(Filefile)throwsIOException{ //将数据转为流 @SuppressWarnings("resource") InputStreamcontent=newFileInputStream(file); ByteArrayOutpu......
  • 基于SpringBoot+微信小程序的智慧医疗线上预约小程序
    一、项目背景介绍:近年来,随着互联网技术的不断发展,人们的生活和工作方式也在逐渐改变。其中,医疗行业也受到了极大的影响。由于传统医疗行业存在着很多问题,例如就医难、看病贵等,因此出现了许多新型医疗模式。线上预约挂号是其中一种新型医疗模式,它通过互联网技术与现代医学......
  • SpringBoot拦截器注入stringredistemplate出现Consider defining a bean of type 'org
    问题自定义拦截器需要注入StringRedisTemplate来通过token获取redis中的数据自定义拦截器代码@ComponentpublicclassLoginInterceptorimplementsHandlerInterceptor{@AutowiredprivateStringRedisTemplatestringRedisTemplate;@Overridepublicb......
  • SSM项目转Springboot项目
    SSM项目转Springboot项目由于几年前写的一个ssm项目想转成springboot项目,所以今天倒腾了一下。最近有人需要毕业设计转换一下,所以我有时间的话可以有偿帮忙转换,需要的私信我或+v:Arousala_首先创建一个新的springboot的工程,然后复制一下相关的依赖<?xmlversion="1.0"enc......
  • 通过滤镜filter属性hue-rotate变换主题的方案
    主题切换方案一般都是依赖Css变量去做,但是可以通过滤镜属性可以实现主题色的变换;1,hue-rotate属性,用于调整元素的色相,色相的概念可以在HSL中看到H:色相S:饱和度L:亮度body{filter:hue-rotate(45deg);}成本几乎为0,实现简单。缺点是对于某些图片或者不想改的颜色需......