spring mvc过滤器Filter与druid数据源中Filter中的区别与关联

一、背景:

  使用阿里druid数据源,可以在页面对sql和spring bean进行调用频次的监控,以排查慢查询等问题,但是必须得配置一些filter,如Log4jFilter、WallConfig、StatFilter等等,一直疑惑druid中的各种filter配置与spring web项目中的filter有什么区别和联系。

二、spring mvc中的Filter:

servlet用于接收get、post请求,并将处理结果返回给前端,而filter则是在servlet前后加上一些特定的处理,filter示例如下:

package com.hwm.filter;
import javax.servlet.*;
import java.io.IOException;

public class MyFilter implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
    }
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        // do something 处理request 或response
        System.out.println("filter1");
        // 调用filter链中的下一个filter
        filterChain.doFilter(servletRequest,servletResponse);
    }
    @Override
    public void destroy() {
    }
}

过滤器通过在servlet执行过程添加过滤链进行实现,参考过滤器中的责任链模式,类似的,拦截器是通过在spring mvc执行过程中加入过滤链进行实现,参考拦截器中的责任链模式

三、druid中的Filter:

以statFilter为例,它是一个用于统计监控信息的过滤器,其中有一个统计连接提交的方法:

@Override  
public void connection_commit(FilterChain chain, ConnectionProxy connection) throws SQLException {  
    chain.connection_commit(connection);  
    JdbcDataSourceStat dataSourceStat = chain.getDataSource().getDataSourceStat();  
    dataSourceStat.getConnectionStat().incrementConnectionCommitCount();  
} 

public void connection_commit(ConnectionProxy connection) throws SQLException {  
    if (this.pos < filterSize) {  
        nextFilter().connection_commit(this, connection);//让下一个干活  
        return;  
    }  
    connection.getRawObject().commit();//都干完了,才真正提交。这个连接也是一个代理,让里面真正的java.sql.connection提交。  
}  
private Filter nextFilter() {  
    Filter filter = getFilters().get(pos++);  
    return filter;  
} 

可以看出,druid过滤器也跟spring mvc过滤器一样,运用了责任链模式/过滤链模式,其中的三要素分别为过滤器StatFilter、过滤链FilterChain、目标对象ConnectionProxy,只不过传统过滤链采用循环去执行过滤链中的过滤器方法,而druid过滤器采用了递归执行的方式,异曲同工。

四、结论:

两者都利用了责任链模式/过滤链模式,虽然作用的位置不一样,spring mvc过滤器作用在servlet service()方法前后,druid filter作用在sql事务提交前后,但是目的都是在目标对象方法的前后增加功能,且可以动态增减过滤器。

参考:
https://www.iteye.com/blog/herman-liu76-2308563
http://www.flyne.org/article/693
https://www.jianshu.com/p/36e60d72e176
https://www.jianshu.com/p/40e7c71a82d6
https://blog.csdn.net/heweimingming/article/details/79993591

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值