【知识积累】springboot使用DelegatingFilterProxy
一、使用
package com.darren.center.springboot.config;
import com.darren.center.springboot.context.ContextFilter;
import com.darren.center.springboot.context.ContextHelper;
import com.darren.center.springboot.filter.Filter1;
import com.darren.center.springboot.filter.Filter2;
import com.darren.center.springboot.filter.WebComponentFilter;
import com.darren.center.springboot.filter.WebComponentFilterChain;
import com.darren.center.springboot.id.CacheIDGenerator;
import com.darren.center.springboot.id.IDGenerator;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.filter.DelegatingFilterProxy;
@Configuration
public class WebConfiguration {
@Bean
public IDGenerator idGenerator(){
return new CacheIDGenerator();
}
@Bean
public ContextHelper contextHelper(){
return new ContextHelper();
}
@Bean
public WebComponentFilterChain webComponentFilterChain(){
return new WebComponentFilterChain();
}
@Bean
public ContextFilter contextFilter(){
return new ContextFilter();
}
@Bean
public Filter1 filter1(){
return new Filter1();
}
@Bean
public Filter2 filter2(){
return new Filter2();
}
@Bean(name = "webComponentFilter")
public WebComponentFilter webComponentFilter(){
return new WebComponentFilter();
}
@Bean
public FilterRegistrationBean filterRegistrationBean(){
FilterRegistrationBean registrationBean = new FilterRegistrationBean();
registrationBean.setFilter(new DelegatingFilterProxy());
registrationBean.addUrlPatterns("/*");
//被代理filter
registrationBean.addInitParameter("targetBeanName", "webComponentFilter");
//指明作用于filter的所有生命周期
registrationBean.addInitParameter("targetFilterLifecycle", "true");
registrationBean.setName("WebComponentFilter");
registrationBean.setOrder(1);
registrationBean.setEnabled(false);
return registrationBean;
}
}
package com.darren.center.springboot.filter;
import com.darren.center.springboot.context.ContextFilter;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
@Slf4j
public class WebComponentFilter implements Filter{
@Autowired
private WebComponentFilterChain webComponentFilterChain;
@Autowired
private ContextFilter contextFilter;
@Autowired
private Filter1 filter1;
@Autowired
private Filter2 filter2;
@Override
public void init(FilterConfig filterConfig) throws ServletException {
List<com.darren.center.springboot.filter.Filter> filters = new ArrayList<>();
filters.add(contextFilter);
filters.add(filter1);
filters.add(filter2);
webComponentFilterChain.setFilters(filters);
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest) servletRequest;
HttpServletResponse response = (HttpServletResponse) servletResponse;
if (webComponentFilterChain != null){
webComponentFilterChain.handler(request, response);
}
filterChain.doFilter(request, response);
}
@Override
public void destroy() {
}
}
二、源码解析
1、类关系图
2、作用
DelegatingFilterProxy类是Filter的子类,是Filter的代理,通过Spring容器来管理Filter的生命周期。
3、查看GenericFilterBean
4、查看DelegatiingFilterProxy的initFilterBean实现
"targetFilterLifecycle"指明作用于Filter的所有生命周期
5、查看DelegatiingFilterProxy的doFilter
调用被代理Filter的doFilter方法