標籤:tomcat response 鉤子 hook 鉤子機制
說起鉤子(Hook)熟悉windows開發的人應該比較熟悉,例如滑鼠鉤子、鍵盤鉤子等。用簡單的語言描述就是在正常處理流程中安置某個鉤子,當執行到安置鉤子的地方就將進入指定的鉤子函數進行處理,待處理完再返回原流程繼續處理,當然也可以直接停止原流程的執行。所以說鉤子是windows訊息處理的一個重要的機制,專門用於監控指定的某些事件訊息。
如果往更高層更抽象的角度來看,鉤子其實是一種機制是一種思想,它的核心思想是在整個複雜的處理流程的所有關鍵點都觸發響應的事件訊息,假如添加了鉤子則會調用鉤子函數,函數中可根據傳遞過來的事件訊息判斷執行不同的邏輯。它就好像透明地讓程式掛上額外的處理,且處理的邏輯可延遲到後面由開發人員自訂。
為什麼要使用鉤子機制?可以這樣認為,在一個龐大的系統內,某些基本的處理流程是相對固定的,且涉及到系統內部邏輯不應該允許外部去修改它,但又要考慮到系統的擴充性,必須預留某些介面讓開發人員在不改變系統內部基本處理流程的情況下可以自訂一些額外的處理邏輯。於是引入鉤子機制,按照鉤子思想最後實現的效果相當是在一個允許在適當位置嵌入自訂的代碼,此機制保證了系統內部不受外界修改同時又預留足夠的擴充空間。
對於java大家比較熟悉的就是JVM的關閉鉤子ShutdownHook了,提供一種在虛擬機器關閉之前進行額外操作的功能。當然鉤子並不僅僅是具體的某些功能,它更是一種機制,是一種設計方法。看看tomcat的響應對象如何使用鉤子機制。
① 定義鉤子介面
public interface ActionHook {
public void action(ActionCode actionCode, Objectparam);
}
② 定義訊息狀態值,為方便理解,假設這裡只有兩種狀態,實際包含了幾十個狀態
public enum ActionCode {
CLOSE, COMMIT
}
③ 響應對象,它包含了鉤子屬性
public class Response {
public ActionHook hook;
public ActionHook getHook() {
return hook;
}
public void setHook(ActionHook hook) {
this.hook = hook;
}
public void action(ActionCode actionCode,Object param) {
hook.action(actionCode, param);
}
}
④ 鉤子處理類,分別對不同的訊息狀態進行不同的邏輯處理
public class Http11Processor implements ActionHook {
public void action(ActionCode actionCode,Object param) {
if (actionCode ==ActionCode.CLOSE) {
System.out.println("Beforeclosing");
} else if (actionCode ==ActionCode.COMMIT) {
System.out.println("Beforecommitting");
}
}
}
⑤ 測試類別,假設對response對象的處理流程如下,那麼在每個關鍵節點都通過action方法觸發鉤子,並附帶上訊息狀態,於是每個關鍵點都能做點額外的事,只要通過修改Http11Processor中action發放即可,根據狀態自訂處理邏輯。
public class HookTest {
public static void main(String[] args) {
ActionHook actionHook=new Http11Processor();
Response response=new Response();
response.setHook(actionHook);
response.action(ActionCode.COMMIT, null);
System.out.println("commit...");
response.action(ActionCode.CLOSE, null);
System.out.println("close...");
}
}
鉤子不僅僅是windows給你留的後門