當前位置:
首頁 > 知識 > Struts2中攔截器

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攔截器淺顯的了解,歡迎補充。

Struts2中攔截器

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 程序員小新人學習 的精彩文章:

你懂ThreadPoolExecutor線程池技術嗎?看源碼你會有全新的認識
使用PHP簡單操作Memcached

TAG:程序員小新人學習 |