Struts2中攔截器
什麼是攔截器:
攔截器是AOP中的概念,它本身是一段代碼,可以通過定義「織入點」,來指定攔截器的代碼在「織入點」的前後執行,從而起到攔截的作用
Struts2的Interceptor,其攔截的對象是Action代碼,可以定義在Action代碼之前或者之後執行攔截器的代碼。
在項目中,我們經常用來攔截通過非正常程序而進行的訪問。例如:許可權操作。
Struts2的攔截器和Servlet過濾器類似。在執行Action的execute方法之前,Struts2會首先執行在struts.xml中引用的攔截器,在執行完所有引用的攔截器的intercept方法後,會執行Action的execute方法。
主要完成解析請求參數、將請求參數賦值給Action屬性、執行數據校驗、文件上傳等工作。
怎麼使用攔截器?
其中intercept方法是攔截器的核心方法,所有安裝的攔截器都會調用之個方法。在Struts2中已經在struts-default.xml中預定義了一些自帶的攔截器,如timer、params等。如果在<package>標籤中繼承struts-default,則當前package就會自動擁有struts-default.xml中的所有配置。代碼如下:
<package name="demo" extends="struts-default" > ... </package>
創建一個Interceptor 可以自定義一個攔截器類實現com.opensymphony.xwork2.interceptor.Interceptor
在這個介面中有三個方法 init destory intercept, intercept方法是真正攔截的方法。
在intercept方法中如果要向下繼續執行,通過其參數ActionInvocation調用它的invoke()方法就可以。
聲明一個Interceptor
在struts.xml文件中
<interceptors>
<interceptor name="" class=""/>
</interceptors>
注意:我們要自己聲明一個interceptor可以在struts.xml文件中聲明。
在struts-default.xml中有一個默認的引用,在默認情況下(也就是<action>中未引用攔截器時)會自動引用一些攔截器。struts2中默認的攔截器是defaultStack.
自定義攔截器需要特別注意的是不要忘記引入struts2默認的攔截器。為了實現某些操作,我們可以自定義攔截器。
在action中指定使用哪些攔截器.
<interceptor-ref name="my"/>
注意:只要顯示聲明使用了一個攔截器。那麼默認的攔截器就不在載入。
攔截器的原理:
通過源代碼的執行流程來了解攔截器的原理:
1.在StrutsPrepareAndExecuteFilter中查找在doFilter方法內有一句話 execute.executeAction (request, response, mapping) 執行Action操作.
2.在executeAction執行過程中會訪問Dispatcher類中的serviceAction,在這個方法中會創建一個
ActionProxy proxy = config.getContainer().getInstance(ActionProxyFactory.class).createActionProxy(namespace, name, method, extraContext, true, false);
這就是我們的Action的代理對象 。
3.查看ActionInvocation,查看其實現類 DefaultActionInvocation.
在其invoke方法中
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);
}
}
通過源代碼分析,發現在DefaultActionInvocation中是通過遞歸完成所有的攔截調用操作.
以上是對struts2攔截器淺顯的了解,歡迎補充。
※你懂ThreadPoolExecutor線程池技術嗎?看源碼你會有全新的認識
※使用PHP簡單操作Memcached
TAG:程序員小新人學習 |