在水木回一个大牛的帖子讨论拦截器,也发到这里。

所谓拦截,是新媳妇回娘家,路遇强盗。重要的是她能不能回家已经取决与强盗而不是自己。看下面的代码:

 

interface AbcInterceptor{

    
boolean beforeExecute(Context context,Command cmd);

    
void afterExecute(Context context,Command cmd);

}

 

我认为这个所谓的拦截器其实名不符其实。原因是这强盗太弱了,他无法阻止新媳妇回娘家,所以也就无所谓拦截,撑死是路边的野草在新媳妇经过的时候摆了摆头——所谓触发的事件而已。

真正的拦截器该是这样:

 

interface RealInterface{

    
void intercept(Context context,Command cmd);

}

 

看Xwork的代码会比较清楚。这样的拦截,才所谓拦截,可怜的人儿能不能见到她娘已经完全掌握在强盗的手里——在强盗的作用下,她可能根本回不了家,也可能被卖了还对外说自己回到了娘家。

XWork里面其实每个interceptor的intercept方法大多要调用actionInvocation.invoke()方法,来完成拦截器链式调用。而ServletFilter里面也大多要写一个chain.doFilter(..)。这里面其实有正主执行前后的玄机,也有控制其是否能走下去的能力。

一家之言。