1. 程式人生 > >Struts2(Interceptor篇):攔截器的實現原理以及程式碼示例

Struts2(Interceptor篇):攔截器的實現原理以及程式碼示例

目錄

Interceptor 簡介

理解 Interceptor 概念

理解 Interceptor 原理

建立 Interceptor 監聽器

在pom.xml加入相關依賴

自定義 Interceptor

自定義一個實現了Interceptor介面的類,或者繼承抽象類AbstractInterceptor。

在配置檔案中註冊定義的攔截器。

過濾器(Filter)與攔截器(Interceptor)的區別

原始碼下載

Interceptor 簡介

理解 Interceptor 概念

java裡的攔截器是動態攔截Action呼叫的物件,它提供了一種機制可以使開發者在一個Action執行的前後執行一段程式碼,也可以在一個Action執行前阻止其執行,同時也提供了一種可以提取Action中可重用部分程式碼的方式。在AOP中,攔截器用於在某個方法或者欄位被訪問之前,進行攔截然後再之前或者之後加入某些操作。

目前,我們需要掌握的主要是Spring的攔截器,Struts2的攔截器不用深究,知道即可,本文僅作參考。

理解 Interceptor 原理

大部分時候,攔截器方法都是通過代理的方式來呼叫的。Struts2的攔截器實現相對簡單。當請求到達Struts2的ServletDispatcher時,Struts2會查詢配置檔案,並根據配置例項化相對的攔截器物件,然後串成一個列表(List),最後一個一個的呼叫列表中的攔截器。Struts2的攔截器是可插拔的(也就是需要的時候裝上去,不需要的時候可以拿下來,其實就是低耦合),攔截器是AOP的一個實現。Struts2攔截器棧就是將攔截器按一定的順序連線成一條鏈。在訪問被攔截的方法或者欄位時,Struts2攔截器鏈中的攔截器就會按照之前定義的順序進行呼叫。

建立 Interceptor 監聽器

本例子使用maven 管理jar包

在pom.xml加入相關依賴

自定義 Interceptor

自定義一個實現了Interceptor介面的類,或者繼承抽象類AbstractInterceptor。

1)建立一個InterceptorDemoOne實現Interceptor,注意是 xwork2.interceptor中的interceptor。

在Interceptor介面中,提供了 3 個方法供咱們使用,分別為init()、destroy()和intercept(),由於AbstractInterceptor實現了Interceptor介面,因此咱們就可以直接繼承AbstractInterceptor,然後複寫方法就可以啦!至於為什麼繼承AbstractInterceptor而不是直接實現Interceptor介面,是因為AbstractInterceptor已經幫咱們實現了空的init()和destroy()方法,不需要咱們自己去複寫了,咱們直接複寫intercept()方法就可以啦!現在,咱們大致瞭解一下這 3 個方法的作用:

  • init()方法,一般用來進行初始化操作;
  • destroy()方法,一般用來進行釋放資源的操作;
  • intercept()方法,該方法是實現攔截功能的主要方法,咱們就在該方法中編寫攔截的邏輯。

2)建立一個InterceptorDemoTwo繼承抽象類AbstractInterceptor,注意是 xwork2.interceptor中的interceptor。

大多數採用這一種。

在配置檔案中註冊定義的攔截器。

在struts.xml中配置攔截器

在需要使用Action中引用上述定義的攔截器,為了方便也可以將攔截器定義為預設的攔截器,這樣在不加特殊說明的情況下,所有的
Action都被這個攔截器攔截。

全域性攔截與Action攔截,區別就在於配置檔案,Action程式碼沒任何區別。

struts.xml關於攔截器和全域性結果集程式碼:

過濾器(Filter)與攔截器(Interceptor)的區別

過濾器可以簡單的理解為“取你所想取”,過濾器關注的是web請求;

攔截器可以簡單的理解為“拒你所想拒”,攔截器關注的是方法呼叫,比如攔截敏感詞彙,攔截登入等。

  1. 攔截器是基於java反射機制來實現的,而過濾器是基於函式回撥來實現的。(有人說,攔截器是基於動態代理來實現的)
  2. 攔截器不依賴servlet容器,過濾器依賴於servlet容器。
  3. 攔截器只對Action起作用,過濾器可以對所有請求起作用。
  4. 攔截器可以訪問Action上下文和值棧中的物件,過濾器不能。
  5. 在Action的生命週期中,攔截器可以多次呼叫,而過濾器只能在容器初始化時呼叫一次。

原始碼下載

[相關示例完整程式碼]請獲取 相關分支哦:feature-20180910-web