美文网首页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源码分析

    DelegatingFilterProxy org.springframework.web.filter.Dele...

  • 2018-05-19

    spring源码分析(五) 目录五、源码分析--5.6、Spring AOP 设计原理及具体实践----5.6.1...

  • 2018-05-12

    spring源码分析(四) 目录五、spring源码分析--5.5、IOC 容器的高级特性----1、介绍----...

  • 2018-06-02

    spring源码分析(七) 目录五、源码分析--5.8 Spring MVC 框架设计原理----5.8.1 Sp...

  • DelegatingFilterProxy

     DelegatingFilterProxy是标准servlet过滤器的一个代理类,它可以代理spring容器中实...

  • DelegatingFilterProxy

    https://blog.csdn.net/u014634338/article/details/81361881...

  • 2018-06-09

    spring源码分析(八) 目录五、源码分析--6、Spring 事务原理详解----6.1、什么是事务(Tran...

  • 主要的类

    DelegatingFilterProxy @EnableWebSecurity WebSecurityConfi...

  • 2018-05-26

    spring源码分析(六) 目录五、spring源码分析--5.7、Spring JDBC 设计原理及二次开发--...

  • zookeeper源码分析系列五状态同步剖析

    zookeeper源码分析系列五状态同步剖析

网友评论

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

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