之前的这篇文章介绍了Druid的连接池管理实现,但除了基本的连接管理,Druid还支持监控,代理等功能,便于开发人员分析数据库操作的一些性能指标等。其主要使用Filter机制来实现,本文将介绍下其中的Filter实现。
-
Filter接口定义
从Filter接口中,可以看出,Filter主要重新定义了来自Connection,Statement,ResultSet等对象的接口,并且均通过对应的Proxy对象来替代,每个接口中还带有一个FilterChain参数,主要是为了支持Filter链,如:
同Filter类似,FilterChain也是定义了Connection,Statement,ResultSet等对象的相关接口,只是在实际调用这些对象前,会先执行一遍配置的Filter链。
-
Filter实现
使用Druid时,一旦配置filters,则在执行数据库操作时,均将使用代理对象(如ConnectionProxy,StatementProxy,ResultSetProxy等),下面将分别描述在使用Filter时,Druid不同的表现。
-
数据库连接获取
Druid内部默认提供了一些可选的Filter,可见META-INF/druid-filter.properties中:
假设需要使用StatFilter(主要作一些连接池相关的监听通知的操作)和Slf4jLogFilter(增加一些Connection,Statement,ResultSet等相关的日志),只需在配置数据源时设置即可:
由上述可知,这些配置的Filter会在获取到连接后再被执行,并且Filter的执行顺序与配置的的顺序相反,即Slf4jLogFilter更先执行。
-
内置的一些Filter
Druid内置了一些常用的Filter,下面将介绍游戏i饿。
-
ConfigFilter
ConfigFilter主要负责从外部获取数据源配置,如:
从配置文件中读取配置;
从远程http文件中读取配置;
为数据库密码提供加密功能。
ConfigFilter常见的配置方式为:
启用ConfigFilter的加解密功能:
-
WallFilter
WallFilter的功能是防御SQL注入攻击。它是基于SQL语法分析,理解其中的SQL语义,然后做处理的,智能,准确,误报率低。对于SQL注入这类问题,通过常见的SQL占位符便可防止,但对于一些其他诸如SQL变量,表的控制,则可以通过WallFilter来处理,WallFilter初始化时,会预先加载一些被禁止的变量,表等,如:
因此,之后在执行SQL相关的操作时,则会先对SQL进行校验,如:
WallFilter相关的详细配置可见这里。
-
EncodingConvertFilter
EncodingConvertFilter主要用于当客户端编码不一致时,使用较少,除非一些遗留问题,应保证客户端与服务端使用的编码一致。
-
StatFilter
StatFilter的功能是主要是用于统计监控信息。比如,通常开发人员会比较关注的慢查询问题,可以用StatFilter来处理,详细配置可见这里:
-
LogFilter
Druid内置提供了四种LogFilter(Log4jFilter、Log4j2Filter、CommonsLogFilter、Slf4jLogFilter),这样开发人员就可以自由配置需要在哪些JDBC操作上进行日志记录,比如数据源,数据库连接等,详细配置可见这里:
-
WebStatFilter
WebStatFilter用于采集web-jdbc关联监控的数据,即通过Servlet容器中的Filter来作相关的收集及监控,详细配置可见这里:
-
实现自己的Filter
实现自己的Filter很简答,只需继承一个Filter适配器(FilterAdapter),重写感兴趣的方法即可:
-
总结
以上,则是有关Druid的Filter机制,也可以说是拦截器机制。