在水木回一個大牛的帖子討論攔截器,也發到這里。
所謂攔截,是新媳婦回娘家,路遇強盜。重要的是她能不能回家已經取決與強盜而不是自己。看下面的代碼:
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(..)。這里面其實有正主執行前后的玄機,也有控制其是否能走下去的能力。
一家之言。