五、DelegatingFilterProxy源码分析

888 阅读1分钟
                                       DelegatingFilterProxy源码分析

DelegatingFilterProxy

org.springframework.web.filter.DelegatingFilterProxy

在这里插入图片描述

可以看出 DelegatingFilterProxy 类继承 GenericFilterBean,间接实现了Filter这个接口,故而该类属于一个过滤器。那么就会有实现Filter中 init、doFilter、destroy三个方法。 filter简介:www.cnblogs.com/xdp-gacl/p/…

GenericFilterBean中实现 filter中 init方法: 在这里插入图片描述 最后调用了

this.initFilterBean();

    protected void initFilterBean() throws ServletException {
    }

现在盯住 initFilterBean() 就ok了

public class DelegatingFilterProxy extends GenericFilterBean {
    private String contextAttribute;
    private WebApplicationContext webApplicationContext;
    private String targetBeanName;
    private boolean targetFilterLifecycle;
    private volatile Filter delegate;
    private final Object delegateMonitor;
     ...
      protected void initFilterBean() throws ServletException {
        Object var1 = this.delegateMonitor;
        synchronized(this.delegateMonitor) {
            if(this.delegate == null) {
                if(this.targetBeanName == null) {
                    this.targetBeanName = this.getFilterName();
                }

                WebApplicationContext wac = this.findWebApplicationContext();
                if(wac != null) {
                    this.delegate = this.initDelegate(wac);
                }
            }

        }
    }
   ...
   }

在DelegatingFilterProxy 中继承GenericFilterBean 重写initFilterBean(),现在就可以解释 如果不想用 filter-name: shiroFilter 也可以用 targerBeanName 的value 这句话了

  1. 在spring容器中去找与 filter-name 相同名字的 bean实例 如果没有设置 targetBeanName 他会默认去加载 filter-name 名字一样的实例initFilterBean() 1、找到被代理类在spring中配置的id并赋值给targetBeanName。 2、使用找到的id从spring容器中找到具体被代理的类,并赋值给delegate
<!--Shiro过滤器-->
<filter>
    <filter-name>shiroFilter</filter-name>
    <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>

    <init-param>
        <param-name>targetFilterLifecycle</param-name>
        <param-value>true</param-value>
    </init-param>
    <init-param>
        <param-name>targetBeanName</param-name>
        <param-value>shiroFilter22</param-value>
    </init-param>
</filter>

DelegatingFilterProxy
private String targetBeanName; private boolean targetFilterLifecycle; private volatile Filter delegate;

在这里插入图片描述

getFilterName()该方法的作用是,获取被代理的filter在spring中配置的id 在这里插入图片描述

private volatile Filter delegate; 获取过滤器

在这里插入图片描述

initDelegate()该方法的作用是,从spring容器中获取到具体被代理的filter  在这里插入图片描述

执行doFilter() 在这里插入图片描述

invokeDelegate方法的作用就是执行被代理filter的doFilter方法 在这里插入图片描述

private boolean targetFilterLifecycle; 默认为false
判断targetFilterLifecycle属性是false还是true,决定是否调用自定义类的init()、destry()方法