在水木回一个大牛的帖子讨论拦截器,也发到这里。
所谓拦截,是新媳妇回娘家,路遇强盗。重要的是她能不能回家已经取决与强盗而不是自己。看下面的代码:
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(..)。这里面其实有正主执行前后的玄机,也有控制其是否能走下去的能力。
一家之言。