routes clear

public class xxxRoute extends Routes {


    @Override
    public void config() {

        addInterceptor(new xxxInterceptor());
        
        add("/api/xxx", xxx.class);

   
    }
}

如上代码 所示 route config 中设计了 addIntercetor() 为什么没有设计上 clearInterceptor()? 我改如何clear route 级别的拦截器?一个一个 controller 添加?

评论区

prelove

2020-11-12 09:33

Jboot的InteceptorBuilder很不错~~~

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()? 其实我不太明白你的具体用法和需求,前面我只是大概猜一下你想要的功能

或是的话

2020-11-12 12:54

@JFinal 感觉波总理解错了 我是有另外一个全局拦截器这里我先叫做globalInterceptor 我想让这个全局拦截器在全局起作用 唯独不想在在这个routes底下起作用 我改怎么配置?

杜福忠

2020-11-12 14:26

image.png
我是拆开实现的,公共无权限》私有限制权限》数据格式规范校验路由》具体业务独立路由 等等组了一个包

或是的话

2020-11-12 15:23

@杜福忠 然后根据需求各自继承不一样route? 感觉有点 难维护 而且也clear 不了全局拦截器 除非你 没设置全局拦截器

杜福忠

2020-11-12 15:45

@或是的话 需要clear 掉那个“全局拦截器” ,那么它其他不能叫全局了,只能算是业务的一种了,我有JSON格式拦截器,就是有做拦截异常转为json返回的。 根据你说的业务,其实不要在 configRoute(Routes me) 这个位置配置就可以了, 拆为两个路由,一个有 你要的拦截器 一个没有就可以了。 如果有大量相同拦截器,可以对拦截器进行打包,或者抽取为同一个公共方法,还可以建base路由,很多方式

JFinal

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 的拦截器种类、配置、用法都在那里了,你只需要灵活组合着去用就一定可以解决

JFinal

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 ;
}

// 这里放上拦截逻辑
....
}
}

zzutligang

2020-11-13 14:13

JFinal里的拦截器已经很灵活了。换个思路,问题就可以得到完美的解决。所以有时候不是问题有多难,而是换个思路有多难。波总上面的解释已经很到位了。

热门反馈

扫码入社