責任鏈(Chain of Responsibility)模式的定義:爲了不請求發送者與多個請求處理者耦合在一塊兒,將全部請求的處理者經過前一對象記住其下一個對象的引用而連成一條鏈;當有請求發生時,可將請求沿着這條鏈傳遞,直到有對象處理它爲止。java
責任鏈模式也叫職責鏈模式。spring
在責任鏈模式中,客戶只須要將請求發送到責任鏈上便可,無須關心請求的處理細節和請求的傳遞過程,因此責任鏈將請求的發送者和請求的處理者解耦了。設計模式
責任鏈模式是一種對象行爲型模式,其主要優勢以下。 下降了對象之間的耦合度。該模式使得一個對象無須知道究竟是哪個對象處理其請求以及鏈的結構,發送者和接收者也無須擁有對方的明確信息。 加強了系統的可擴展性。能夠根據須要增長新的請求處理類,知足開閉原則。 加強了給對象指派職責的靈活性。當工做流程發生變化,能夠動態地改變鏈內的成員或者調動它們的次序,也可動態地新增或者刪除責任。 責任鏈簡化了對象之間的鏈接。每一個對象只需保持一個指向其後繼者的引用,不需保持其餘全部處理者的引用,這避免了使用衆多的 if 或者 if···else 語句。 責任分擔。每一個類只須要處理本身該處理的工做,不應處理的傳遞給下一個對象完成,明確各種的責任範圍,符合類的單一職責原則。緩存
職責鏈模式主要包含如下角色: 抽象處理者(Handler)角色:定義一個處理請求的接口,包含抽象處理方法和一個後繼鏈接。 具體處理者(Concrete Handler)角色:實現抽象處理者的處理方法,判斷可否處理本次請求,若是能夠處理請求則處理,不然將該請求轉給它的後繼者。 客戶類(Client)角色:建立處理鏈,並向鏈頭的具體處理者對象提交請求,它不關心處理細節和請求的傳遞過程。安全
在spring security
中其核心設計模式就是責任鏈模式;它經過註冊過濾器鏈來實現責任鏈模式,每一個過濾器鏈都只作一件事。springSecurity的責任鏈順序以下cookie
WebAsyncManagerIntegrationFilter:將Security上下文與Spring Web中用於處理異步請求映射的 WebAsyncManager 進行集成。SecurityContextPersistenceFilter:在每次請求處理以前將該請求相關的安全上下文信息加載到SecurityContextHolder中,而後在該次請求處理完成以後,將SecurityContextHolder中關於此次請求的信 息存儲到一個「倉儲」中,而後將SecurityContextHolder中的信息清除 例如在Session中維護一個用戶的安全信息就是這個過濾器處理的。session
HeaderWriterFilter:用於將頭信息加入響應中框架
CsrfFilter:用於處理跨站請求僞造異步
LogoutFilter:用於處理退出登陸設計
UsernamePasswordAuthenticationFilter:用於處理基於表單的登陸請求,從表單中獲取用戶名和密碼。默認狀況下處理來自「/login」的請求。從表單中獲取用戶名和密碼時,默認使用的表單name值爲「username」和「password」,這兩個值能夠經過設置這個過濾器的usernameParameter 和 passwordParameter 兩個參數的值進行修改。
DefaultLoginPageGeneratingFilter:若是沒有配置登陸頁面,那系統初始化時就會配置這個過濾器,而且用於在須要進行登陸時生成一個登陸表單頁面。
BasicAuthenticationFilter:檢測和處理http basic認證
RequestCacheAwareFilter:用來處理請求的緩存
SecurityContextHolderAwareRequestFilter:主要是包裝請求對象request
AnonymousAuthenticationFilter:檢測SecurityContextHolder中是否存在Authentication對象,若是不存在爲其提供一個匿名Authentication
SessionManagementFilter:管理session的過濾器
ExceptionTranslationFilter:處理 AccessDeniedException 和 AuthenticationException 異常
FilterSecurityInterceptor:能夠看作過濾器鏈的出口
RememberMeAuthenticationFilter:當用戶沒有登陸而直接訪問資源時, 從cookie裏找出用戶的信息, 若是Spring Security可以識別出用戶提供的remember me cookie, 用戶將沒必要填寫用戶名和密碼, 而是直接登陸進入系統,該過濾器默認不開啓。
而責任鏈的客戶類是HttpSecurity
,它負責對責任鏈的建立和管理,它的addFilterAt(Filter filter, Class atFilter)
方法可在責任鏈中添加一個過濾器。 在這個框架中 過濾器做爲了抽象處理者(Handler
的角色,各個具體的過濾器類是具體處理者(Concrete Handler
角色 HttpSecueiry
是客戶類
角色。
點擊關注個人博客