springboot自定义filter学习笔记

        自定义Filter,首先要自己写一个类,实现java.sevlet.Filter接口的init、doFilter和destroy三个方法。

        在web项目中,通过web.xml中的<filter>标签,可以将该自定义filter交由容器实例化,然后通过<filter-mapping>标签配置过滤路径。如果需要将该filter使用spring管理,比如该filter需要用到spring的其他bean,那么可以在web.xml中配置spring的filter代理类org.springframework.web.filter.DelegatingFilterProxy实现,在spring中实例化需要代理的filer为bean,只要保证<filter-name>和bean的id一致即可。注意需要设置代理filter的targetFilterLifecycle为true: 

  <filter>
    <filter-name>myfilter</filter-name>
    <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
    <init-param>
      <!-- 这个配置我没听懂说的什么意思,大概是说保证bean的生命周期要和filter保持一致 -->
      <param-name>targetFilterLifecycle</param-name>
      <param-value>true</param-value>
    </init-param>
  </filter>
  <filter-mapping>
    <filter-name>myfilter</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>

 

        在springboot中项目中有三种方式让该自定义filter生效。

1.方法一: springboot提供了注册filer的类FilterRegistrationBean,实例化该类可注册自定义filter,代码如下:

@Configuration
public class ApplicationConfiguration{
    @Bean
    public FilterRegistrationBean myFilter() {
        FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean();
        MyFilter myFilter = new MyFilter();
        filterRegistrationBean.setFilter(myFilter);
        List<String> urls = new ArrayList<>();
        urls.add("/users/*");
        filterRegistrationBean.setUrlPatterns(urls);//配置过滤规则
        return filterRegistrationBean;
    }
}

Springboot还提供了注解实现的方式,这里不再赘述,主要是自定义filter类上增加@WebFilter的注解来实现。

2.方法二,借助spring的filter代理类DelegatingFilterProxy和springboot的FilterRegistrationBean一起实现,代码如下:

@Configuration
public class ApplicationConfiguration{
    @Bean
    public FilterRegistrationBean myFilter() {
        FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean();
        filterRegistrationBean.setFilter(new DelegatingFilterProxy("myFilter"));
        filterRegistration.addInitParameter("targetFilterLifecycle", "true");
		filterRegistration.setEnabled(true);
		filterRegistration.addUrlPatterns("/*");
        return filterRegistrationBean;
    }
}

springboot中还有一种合并起来的写法,代码如下:

@Configuration
public class ApplicationConfiguration{
	@Bean
    public DelegatingFilterProxyRegistrationBean delegatingFilterProxyRegistrationBean(){
        DelegatingFilterProxyRegistrationBean bean = new DelegatingFilterProxyRegistrationBean("myFilter");
        bean.addInitParameter("targetFilterLifecycle", "true");
        bean.setEnabled(true);
        bean.addUrlPatterns("/*");
        return bean;
    }
}

3.方法三,直接实例化自定义的Filter,但是这种Filter无法定义拦截规则,默认全局拦截,慎用。

 

        第一种和第二种方法本质是一样的,,主要就是FilterRegistrationBean这个类,通过AbstractFilterRegistrationBean接口间接实现了ServletContextInitializer,在springboot中启动容器后会查找实现该接口的bean,并调用onStartup()方法将自定义的Filter添加到容器中。

        两者的区别是方法一直接设置Filter,该Filter可以不用spring管理,比如上面方法一的代码所示,直接new MyFilter(),也可以由spring管理,比如将new MyFilter()的地方换成方法三的方式实现(此时方法三形式的filter将不会作为全局过滤器了)。而方法二通过DelegatingFilterProxy传入filter名字,在WebApplicationContext查找该Filter Bean,并将DelegatingFilterProxy生成的Bean作为filter的代理对象,这样做的目的是,和有web.xml时的项目一样,容器加载时先加载代理Filter,不需要直接加载真正的Filter,达到懒加载的效果(有web.xml时的项目使用代理filter,必须懒加载,因为在web.xml加载filter的时候,spring中真正的filter bean还没有创建。)。

转载于:https://my.oschina.net/u/3651261/blog/3023278

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值