struts2核心功能都是基於struts2攔截器的,而攔截器又是基於java的動態代理。html
要實現struts2攔截器,需在struts.xml中配置攔截器,每一個action能夠指定攔截器,指定了攔截器以後默認的攔截器鏈就失效了,須要從新顯示指定攔截器鏈java
攔截器(interceptor)是Struts2最強大的特性之一,也能夠說是struts2的核心,攔截器可讓你在Action和result被執行以前或以後進行一些處理。同時,攔截器也可讓你將通用的代碼模塊化並做爲可重用的類。Struts2中的不少特性都是由攔截器來完成的。攔截是AOP(Aspect Objected Programing:面向切面編程)的一種實現策略。在Webwork的中文文檔的解釋爲:攔截器是動態攔截Action調用的對象。它提供了一種機制可使開發者能夠定義在一個action執行的先後執行的代碼,也能夠在一個action執行前阻止其執行。同時也是提供了一種能夠提取action中可重用的部分的方式。談到攔截器,還有一個詞你們應該知道——攔截器鏈(Interceptor Chain,在Struts 2中稱爲攔截器棧Interceptor Stack)。攔截器鏈就是將攔截器按必定的順序聯結成一條鏈。在訪問被攔截的方法或字段時,攔截器鏈中的攔截器就會按其以前定義的順序被調用。編程
一.攔截器的實現原理:模塊化
大部分時候,攔截器方法都是經過代理的方式來調用的。Struts 2的攔截器實現相對簡單。當請求到達Struts 2的ServletDispatcher時,Struts 2會查找配置文件,並根據其配置實例化相對的攔截器對象,而後串成一個列表(list),最後一個一個地調用列表中的攔截器。事實上,咱們之因此可以如此靈活地使用攔截器,徹底歸功於「動態代理」的使用。動態代理是代理對象根據客戶的需求作出不一樣的處理。對於客戶來講,只要知道一個代理對象就好了。那Struts2中,攔截器是如何經過動態代理被調用的呢?當Action請求到來的時候,會由系統的代理生成一個Action的代理對象,由這個代理對象調用Action的execute()或指定的方法,並在struts.xml中查找與該Action對應的攔截器。若是有對應的攔截器,就在Action的方法執行前(後)調用這些攔截器;若是沒有對應的攔截器則執行Action的方法。其中系統對於攔截器的調用,是經過ActionInvocation來實現的。spa
參考:struts2攔截器的實現原理及源碼剖析代理