struts2攔截器的執行原理以及攔截器和過濾器的區別
struts2攔截器的執行原理:
注意:struts2.1.3以後的版中下邊這張圖中的FilterDispatcher已經改為StrutsPrepareAndExecuteFilter
1.首先伺服器接受請求,首先載入web.xml,通過核心控制器StrutsPrepareAndExecuteFilter,通過StrutsPrepareAndExecuteFilter載入struts.xml檔案並進行解析,將解析好的資料資訊放在ActionMapper中。
2.客戶傳送請求,請求被核心控制器StrutsPrepareAndExecuteFilter進行攔截,他會通過ActionMapper找到對應的url地址,找到Action中對應的方法
3.執行Action代理方法,在執行方法中會判斷是否有下一個攔截器如下:
if (interceptors.hasNext()) {//判斷是否有下一個攔截器. final InterceptorMapping interceptor = interceptors.next(); //得到一個攔截器 String interceptorMsg = "interceptor: " + interceptor.getName(); UtilTimerStack.push(interceptorMsg); try { resultCode = interceptor.getInterceptor().intercept(DefaultActionInvocation.this); //呼叫得到的攔截器的攔截方法.將本類物件傳遞到了攔截器中。 } finally { UtilTimerStack.pop(interceptorMsg); } }
4.得到返回資料並響應給客戶端。
攔截器和過濾器的區別
1.攔截器是基於java反射機制的,而過濾器是基於函式回撥的。
2.過濾器是依賴於servlet容器的,而攔截器是不依賴servlet容器的。
3.攔截器只能對Action請求起作用,不能對靜態資源起作用(jsp,html),而過濾器可以對幾乎所有請求起作用。
4.攔截器可以訪問Action上下文,值棧裡的物件,而過濾器不能。
5.在Action的生命週期中,攔截器可以多次使用,而過濾器只能在容器初始化時被呼叫一次。