如何在interceptor中动态移除interceptor?

例如有10个全局拦截器,走到第二个的时候 经过逻辑判断,想要移除其中的几个拦截器。如何操作?

简而言之,就是在拦截器中动态的添加和移除拦截器!

评论区

JFinal

2019-02-20 16:32

在需要被移除的拦截器中用 if 判断一下,不要调相关逻辑就好,例如,在决定移除的地方先放个标记值:
if (...)
inv.getController().setAttr("removeInterceptors", true);

然后在被移除的拦截器中:
Boolean remove = inv.getController().getAttr("removeInterceptors");

然后根据 remove 决定是不是要调用本拦截器中的逻辑

你这个需求要考虑一下用 @Clear 注解来移除拦截器,更优雅,看一下 @Clear 文档:
https://www.jfinal.com/doc/4-4

Terely

2019-02-20 16:40

@JFinal 我这个貌似不能用clear来做。 又不想通过添加@before 来实现感觉代码上太罗嗦。你提出的这个方案,虽然业务上没有执行这个拦截器,但是还是进入了这个拦截器,比如打印actionreport的时候 一大串10个拦截器,那么吓人,其实只走了3个的逻辑而已。

Terely

2019-02-20 16:50

@JFinal 比较理想的解决方案是 ,通过在 inv 中获取action 的 interceptors 列表,然后动态增删,目前jfinal还不支持吧!看源码,貌似 修改 jf源码 ,增加动态修改inters[]的方法,在执行拦截器链的时候都重新获取一下当前的拦截器对象数组,执行完一个移除一个,可能可以实现,比较麻烦,还是不改了。先用其他方式解决

JFinal

2019-02-20 16:53

@Terely 拦截器是单例,是整体缓存的,才能达到极致性能,不允许删除

全面掌握拦截器的用法,根本无需采用删除的办法来满足需求

拦截器可配置 global、routes、class、method 四个级别,还有 @Clear 配合删除,足以满足各种需求,根本用不上动态删除

热门反馈

扫码入社