2020-11-12 16:31
@杜福忠 同学的方向是最好的, 在 configHandler 中可以配置 ActionHandler :
me.setActionHandler(...)
你只需要拿到 jfinal 默认的 ActionHandler, 继承一下它, 然后覆盖掉父类的 handler 方法, 然后将父类 handle 方法中的内容照抄,再加上自己的 ip 输出就可以了
注意,有几处地方输出了 404 Action Not Found, 都要处理一下
2020-11-12 16:02
@或是的话 我再补充一下,有些情况可能比你现在的需求更复杂,除了用 @Clear 适当清除以外
还要以在拦截器内部去控制,例如下面这样:
pubic MyInter implements Interceptor {
// 用于排除指定的 controllerPath 不拦截
Set《String》excludeControllerPathSet = new HashSet();
// 初始化。可以通过外部配置文件来初始化,或者读数据库 初始化
static {
excludeControllerPathSet.add("/xxx");
excludeControllerPathSet.add("/yyy");
...
}
public void intercept(Invocation inv) {
// 被排除的 controllerPath 不拦截,直接调用 invoke() 放行
if (excludeControllerPathSet.contains(inv.getControllerPath()) {
inv.invoke();
return ;
}
// 这里放上拦截逻辑
....
}
}
2020-11-12 15:57
@或是的话 你是有另外一个全局拦截器,这里你先叫做 GlobalInterceptor 我想让这个全局拦截器在全局起作用 唯独不想在在这个 routes 底下起作用
上面是我对你需求的一个重复确认,下面是我假定你项目的一些其它特征:
1:我假定你有 AaaRoutes、BbbRoutes、CccRoutes 三个 Routes
2:你现在还有一个 GlobalInterceptor ,但你不希望它在 AaaRoutes 中有效
你只要换个思路就可以解决了:
1:将 GlobalInterceptor 从 configInterceptor(Interceptors inters) 中拿掉
2:再将 GlobalInterceptor 分别添加到 BbbRoutes、CccRoutes 中就可以了,也就是说唯独 AaaRoutes 中不添加它
当然,将 GlobalInterceptor 改个名字可能更好,因为它已经不用于全局拦截了,而是选择性的挑选了一些 Routes 去拦截
总之,jfinal 的拦截器种类、配置、用法都在那里了,你只需要灵活组合着去用就一定可以解决
2020-11-12 11:14
Routes 级别拦截器使用的场景就是将所有需要该 Routes 拦截器的 controller 集中起来配置
你的需求其实很容易解决,将不需要 Routes 拦截器的 controller 移走入放在 configRoute(Routes me) 之中,通过 me.add(...) 添加,或者再拆分到一个新的 Routes 中去
一般来说,你的需求分两种情况:
1:需要移除 Routes 拦截器的 controller 数量较少,这种情况在相应的 controller 上用 @Clear 移除,例如你要处理的是 XxxController:
@Clear({XxxInter.class, YyyInter.class})
public class XxxController extends Controller {
...
}
2:需要移除 Routes 拦截器的 controller 数量较少,拆分为一个新的 Routes 就可以了
你所说的 为什么没有设计上 clearInterceptor()? 其实我不太明白你的具体用法和需求,前面我只是大概猜一下你想要的功能