DruidPlugin 插件的自定义Filter

詹波老师您好:

下面代码是配置druid插件的,有一个TestFilter是自定义的(继承自FilterEventAdapter类),部分代码如下:

druidPlugin.addFilter(new TestFilter());

druidPlugin.addFilter(new StatFilter());

druidPlugin.addFilter(new WallFilter());

druidPlugin.setFilters("stat,wall");

出现是的疑问是如何将TestFilter也添加到druidPlugin.setFilters("stat,wall")里面,实现在执行sql语句之前或者之后进行一些处理工作。

请帮忙赐教,谢谢!


评论区

JFinal

2018-05-15 17:46

将 druidPlugin.setFilters("stat,wall"); 这句也改成 addFilter(new WallFilter()) addFilter(new StatFilter()) 的风格即可

因为你的 druidPlugin.setFilters("stat,wall"); 会冲掉前面的 addFilter

shanmine

2018-05-15 20:28

@JFinal 如果不加druidPlugin.setFilters("stat,wall")这句,在插件的start()过程中(debug跟踪)时候,发现filters=null,所以才想如何将TestFilter放在filters中,谢谢。

shanmine

2018-05-16 09:10

@JFinal 波总好:细看了一下druid插件的添加filters的方法,最后得到的targetList过滤器数组并没有调用ds.setProxyFilters(targetList),因此添加的自定义druid过滤器没有执行是否原因出在这里呢?帮忙确认,谢谢!
private void addFilterList(DruidDataSource ds) {
if (filterList != null) {
List targetList = ds.getProxyFilters();
for (Filter add : filterList) {
boolean found = false;
for (Filter target : targetList) {
if (add.getClass().equals(target.getClass())) {
found = true;
break;
}
}
if (! found)
targetList.add(add);
}
}
}

shanmine

2018-05-16 10:12

@JFinal 谢谢波总,问题找到了,不是插件的问题,是我的过滤器监视的不对,打扰波总了!

jyzhao

2019-09-21 17:00

@shanmine 我这里也出现加入过滤器,但是不起作用,查看addFilter(new TestFilter()); 后 filterList 中是存在 testFilter 的,但是在sql 执行时 ,就是不执行拦截器中方法。
具体filter 如下,麻烦看一下有什么问题吗?
public class TestFilter extends FilterEventAdapter {
protected final Log log = Log.getLog(getClass());
@Override
protected void statementExecuteAfter(StatementProxy statement, String sql, boolean result) {
log.info("init TestFilter after");
super.statementExecuteAfter(statement, sql, result);
}
@Override
protected void statementExecuteBefore(StatementProxy statement, String sql) {
log.info("init TestFilter befor");
super.statementExecuteBefore(statement, sql);
}
}

热门反馈

扫码入社