dubbo的filter

在聊Dubbo Filter之前,我们先说说Web标准的javax.servlet.Filter

public interface Filter {
   
  	// 初始化,Servlet容器启动时调用
    void init(FilterConfig var1) throws ServletException;

  	// 做过滤动作
    void doFilter(ServletRequest var1, ServletResponse var2, FilterChain var3) throws IOException, ServletException;
		
  	// 销毁,优雅停机才会调用
    void destroy();
}

以上是javax.servlet.Filter的接口定义。3个行为,分别是初始化,执行,销毁。

初始化和销毁动作,就不在这边聊了。看看doFilter行为

@Override
public void doFilter(ServletRequest request, ServletResponse response,
                     FilterChain filterChain) throws IOException, ServletException {
   
    // do business before
    filterChain.doFilter(httpRequest, response);
    // do business after
    return;
	}
	super.doFilter(httpRequest, response, filterChain);
}

实现了javax.servlet.Filter接口的实现类,需要实现doFilter方法。一般都会像上面这个示例一样编写代码。关键代码filterChain.doFilter(httpRequest, response);

这行代码需要开发者自己写,实际上是使用filterChain去调用下一个filterFilterChain 的实例中维护了一个过滤器链的列表。每次调用doFilter方法,就会去找下一个执行。直到最后,都执行完了就去执行servlet。看下Tomcat的源码实现。

// 过滤器链数组
private ApplicationFilterConfig[] filters = new ApplicationFilterConfig[0];

private void internalDoFilter(ServletRequest request,
                                  ServletResponse response)
        throws IOException, ServletException {
   

        // Call the next filter if there is one
        if (pos < n) {
    // pos就是指当前要执行哪个
            ApplicationFilterConfig filterConfig = filters[pos++];
            Filter filter = null;
            filter = filterConfig.getFilter();
            // --------------------此处省略一堆代码-----------------------
            filter.doFilter(request, response, this);
            // --------------------此处省略一堆代码-----------------------
            return;
        }

        // We fell off the end of the chain -- call the servlet instance
    		// 这边开始执行serlvet
    }

从这块代码可以看到Tomcat执行过滤器链的过程。有兴趣的朋友可以追踪下源码。把javax.servlet.Filter放在前面说,是因为Dubbo Filterjavax.servlet.Filter很像,至少对开发者来讲是这样的。

不同之处:Dubbo Filter过滤器链的封装方式和执行方式不太一样。javax.servlet.Filter可以很明显在ApplicationFilterChain中知道filters这个数组,很明显,它维护了一个过滤器链。而Dubbo Filter是使用了Wapper的方式。将所有的过滤器一个包着一个。看下面这张图,可能会有些感觉了。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值