在水木回一個大牛的帖子討論攔截器,也發到這里。

所謂攔截,是新媳婦回娘家,路遇強盜。重要的是她能不能回家已經取決與強盜而不是自己。看下面的代碼:

 

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(..)。這里面其實有正主執行前后的玄機,也有控制其是否能走下去的能力。

一家之言。