美文网首页shiro
五、DelegatingFilterProxy源码分析

五、DelegatingFilterProxy源码分析

作者: 凌晨丶杨先森灬 | 来源:发表于2019-10-11 15:49 被阅读0次
                                           DelegatingFilterProxy源码分析
    

    DelegatingFilterProxy

    org.springframework.web.filter.DelegatingFilterProxy

    在这里插入图片描述

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

    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()方法

    相关文章

      网友评论

        本文标题:五、DelegatingFilterProxy源码分析

        本文链接:https://www.haomeiwen.com/subject/bntxmctx.html