Spring Boot之过滤器 Filter注入的方式解析

 更新时间:2021年11月15日 11:49:47   作者:Jaymeng8848  
这篇文章主要介绍了Spring Boot之过滤器 Filter注入的方式解析,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

过滤器 Filter注入的方式

第一种

@WebFilter(filterName = "myFilter",urlPatterns = "/*")
public class MyFilter implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
    }
    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) {
    }
    @Override
    public void destroy() {
    }
}
@SpringBootApplication
@EnableAutoConfiguration
@EnableWebMvc
@ServletComponentScan(basePackages = "com.fanyin.eghm")
public class EghmApplication {
    public static void main(String[] args) {
        SpringApplication.run(EghmApplication.class, args);
    }
}

@ServletComponentScan 所扫描的包路径必须包含该Filter

第二种

@Configuration
public class FilterConfig {
    @Bean
    public FilterRegistrationBean filterRegistrationBean(){
        FilterRegistrationBean bean = new FilterRegistrationBean();
        bean.setFilter(new MyFilter2());
        bean.addUrlPatterns("/*");
        return bean;
    }
}

第三种

@Bean("proxyFilter")
    public Filter filter (){
        return new Filter() {
            @Override
            public void init(javax.servlet.FilterConfig filterConfig) throws ServletException {
            }
            @Override
            public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) {
            }
            @Override
            public void destroy() {
            }
        };
    }
    @Bean
    public DelegatingFilterProxyRegistrationBean delegatingFilterProxyRegistrationBean(){
        DelegatingFilterProxyRegistrationBean bean = new DelegatingFilterProxyRegistrationBean("proxyFilter");
        bean.addUrlPatterns("/*");
        return bean;
    }

方法四

@Bean("myFilter")
    public Filter filter (){
        return new Filter() {
            @Override
            public void init(javax.servlet.FilterConfig filterConfig) throws ServletException {
            }
            @Override
            public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) {
            }
            @Override
            public void destroy() {
            }
        };
    }

说明:

第二种和第三种类似,均实现了AbstractFilterRegistrationBean接口,而该接口间接实现了ServletContextInitializer,springboot在启动容器后会查找实现该接口的bean,并调用**onStartup()**方法添加自定义的Filter,两则的区别 DelegatingFilterProxyRegistrationBean 通过传入的proxyFilter名字,在WebApplicationContext查找该Fillter Bean,并通过DelegatingFilterProxy生成基于该Bean的代理Filter对象,

而FilterRegistrationBean 则是直接设置一个Filter,因此该Filter可以有spring容器管理,也可不用spring管理

注意:如果Filter声明为一个Bean,则不需要定义为FilterRegistrationBean,也会被spring发现并添加,就是方法四,该方式无法定义拦截规则等,默认全局,慎用!

注入自定义Filter

直接举个例子,我现在想实现一个Filter,过滤所有访问/admin前缀的请求

public class AdminFilter implements Filter { 
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        System.out.println("此时有人访问admin");
        filterChain.doFilter(servletRequest,servletResponse);
        System.out.println("该人以及访问结束");
    }
}

这里我虽然自定义了一个Filter,但是是无法扫描到的。

有两种方式可以解决这个,一个是在启动类增加

@ServletComponentScan

这个注解不管是Filter还是Servlet都适用

另一种方式就是通过注入

FilterRegistrationBean

如下:

@Bean
    public FilterRegistrationBean filterRegistrationBean(){
        FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean(new AdminFilter());
        filterRegistrationBean.addUrlPatterns("/admin/*");
        return filterRegistrationBean;
    }

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Java数据结构之线段树中的懒操作详解

    Java数据结构之线段树中的懒操作详解

    对于线段树,若要求对区间中的所有点都进行更新,可以引入懒操作。懒操作包括区间更新和区间查询操作。本文将通过一个示例和大家详细聊聊线段树中的懒操作,需要的可以参考一下
    2022-10-10
  • Java使用设计模式中迭代器模式构建项目的代码结构示例

    Java使用设计模式中迭代器模式构建项目的代码结构示例

    这篇文章主要介绍了Java使用设计模式中迭代器模式构建项目的代码结构示例,迭代器模式能够对访问者隐藏对象的内部细节,需要的朋友可以参考下
    2016-05-05
  • springBoot+mybaties后端多层架构的实现示例

    springBoot+mybaties后端多层架构的实现示例

    本文主要介绍了springBoot+mybaties后端多层架构的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-07-07
  • ActiveMQ简单入门(新手必看篇)

    ActiveMQ简单入门(新手必看篇)

    下面小编就为大家带来一篇ActiveMQ简单入门(新手必看篇)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-06-06
  • 彻底理解Java 中的ThreadLocal

    彻底理解Java 中的ThreadLocal

    这篇文章主要介绍了彻底理解Java 中的ThreadLocal的相关资料,需要的朋友可以参考下
    2017-07-07
  • Java对时间的简单操作实例

    Java对时间的简单操作实例

    这篇文章主要介绍了Java对时间的简单操作,实例分析了针对java.util.Date的各类常见操作,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-01-01
  • 详解Java如何通过Socket实现查询IP

    详解Java如何通过Socket实现查询IP

    在本文中,我们来学习下如何找到连接到服务器的客户端计算机的IP地址。我们将创建一个简单的客户端-服务器场景,让我们探索用于TCP/IP通信的java.net API,感兴趣的可以了解一下
    2022-10-10
  • Java程序运行之JDK,指令javac java解读

    Java程序运行之JDK,指令javac java解读

    这篇文章主要介绍了Java程序运行之JDK,指令javac java,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-01-01
  • Spring Bean管理注解方式代码实例

    Spring Bean管理注解方式代码实例

    这篇文章主要介绍了Spring Bean管理注解方式代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-03-03
  • java ThreadPool线程池的使用,线程池工具类用法说明

    java ThreadPool线程池的使用,线程池工具类用法说明

    这篇文章主要介绍了java ThreadPool线程池的使用,线程池工具类用法说明,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-10-10

最新评论