設(shè)計(jì)模式-責(zé)任鏈模式

責(zé)任鏈(Chain of Responsibility)模式的定義:為了避免請求發(fā)送者與多個(gè)請求處理者耦合在一起,將所有請求的處理者通過前一對象記住其下一個(gè)對象的引用而連成一條鏈;當(dāng)有請求發(fā)生時(shí),可將請求沿著這條鏈傳遞,直到有對象處理它為止。

責(zé)任鏈模式也叫職責(zé)鏈模式。

在責(zé)任鏈模式中,客戶只需要將請求發(fā)送到責(zé)任鏈上即可,無須關(guān)心請求的處理細(xì)節(jié)和請求的傳遞過程,所以責(zé)任鏈將請求的發(fā)送者和請求的處理者解耦了。

責(zé)任鏈模式是一種對象行為型模式,其主要優(yōu)點(diǎn)如下。 降低了對象之間的耦合度。該模式使得一個(gè)對象無須知道到底是哪一個(gè)對象處理其請求以及鏈的結(jié)構(gòu),發(fā)送者和接收者也無須擁有對方的明確信息。 增強(qiáng)了系統(tǒng)的可擴(kuò)展性??梢愿鶕?jù)需要增加新的請求處理類,滿足開閉原則。 增強(qiáng)了給對象指派職責(zé)的靈活性。當(dāng)工作流程發(fā)生變化,可以動(dòng)態(tài)地改變鏈內(nèi)的成員或者調(diào)動(dòng)它們的次序,也可動(dòng)態(tài)地新增或者刪除責(zé)任。 責(zé)任鏈簡化了對象之間的連接。每個(gè)對象只需保持一個(gè)指向其后繼者的引用,不需保持其他所有處理者的引用,這避免了使用眾多的 if 或者 if···else 語句。 責(zé)任分擔(dān)。每個(gè)類只需要處理自己該處理的工作,不該處理的傳遞給下一個(gè)對象完成,明確各類的責(zé)任范圍,符合類的單一職責(zé)原則。

模式結(jié)構(gòu)

職責(zé)鏈模式主要包含以下角色: 抽象處理者(Handler)角色:定義一個(gè)處理請求的接口,包含抽象處理方法和一個(gè)后繼連接。 具體處理者(Concrete Handler)角色:實(shí)現(xiàn)抽象處理者的處理方法,判斷能否處理本次請求,如果可以處理請求則處理,否則將該請求轉(zhuǎn)給它的后繼者。 客戶類(Client)角色:創(chuàng)建處理鏈,并向鏈頭的具體處理者對象提交請求,它不關(guān)心處理細(xì)節(jié)和請求的傳遞過程。

源碼導(dǎo)讀

spring security 中其核心設(shè)計(jì)模式就是責(zé)任鏈模式;它通過注冊過濾器鏈來實(shí)現(xiàn)責(zé)任鏈模式,每個(gè)過濾器鏈都只做一件事。springSecurity的責(zé)任鏈順序如下

WebAsyncManagerIntegrationFilter:將Security上下文與Spring Web中用于處理異步請求映射的 WebAsyncManager 進(jìn)行集成。

SecurityContextPersistenceFilter:在每次請求處理之前將該請求相關(guān)的安全上下文信息加載到SecurityContextHolder中,然后在該次請求處理完成之后,將SecurityContextHolder中關(guān)于這次請求的信 息存儲到一個(gè)“倉儲”中,然后將SecurityContextHolder中的信息清除 例如在Session中維護(hù)一個(gè)用戶的安全信息就是這個(gè)過濾器處理的。

HeaderWriterFilter:用于將頭信息加入響應(yīng)中

CsrfFilter:用于處理跨站請求偽造

LogoutFilter:用于處理退出登錄

UsernamePasswordAuthenticationFilter:用于處理基于表單的登錄請求,從表單中獲取用戶名和密碼。默認(rèn)情況下處理來自“/login”的請求。從表單中獲取用戶名和密碼時(shí),默認(rèn)使用的表單name值為“username”和“password”,這兩個(gè)值可以通過設(shè)置這個(gè)過濾器的usernameParameter 和 passwordParameter 兩個(gè)參數(shù)的值進(jìn)行修改。

DefaultLoginPageGeneratingFilter:如果沒有配置登錄頁面,那系統(tǒng)初始化時(shí)就會(huì)配置這個(gè)過濾器,并且用于在需要進(jìn)行登錄時(shí)生成一個(gè)登錄表單頁面。

BasicAuthenticationFilter:檢測和處理http basic認(rèn)證

RequestCacheAwareFilter:用來處理請求的緩存

SecurityContextHolderAwareRequestFilter:主要是包裝請求對象request

AnonymousAuthenticationFilter:檢測SecurityContextHolder中是否存在Authentication對象,如果不存在為其提供一個(gè)匿名Authentication

SessionManagementFilter:管理session的過濾器

ExceptionTranslationFilter:處理 AccessDeniedException 和 AuthenticationException 異常

FilterSecurityInterceptor:可以看做過濾器鏈的出口

RememberMeAuthenticationFilter:當(dāng)用戶沒有登錄而直接訪問資源時(shí), 從cookie里找出用戶的信息, 如果Spring Security能夠識別出用戶提供的remember me cookie, 用戶將不必填寫用戶名和密碼, 而是直接登錄進(jìn)入系統(tǒng),該過濾器默認(rèn)不開啟。

而責(zé)任鏈的客戶類是HttpSecurity,它負(fù)責(zé)對責(zé)任鏈的創(chuàng)建和管理,它的addFilterAt(Filter filter, Class atFilter) 方法可在責(zé)任鏈中添加一個(gè)過濾器。 在這個(gè)框架中 過濾器作為了抽象處理者(Handler的角色,各個(gè)具體的過濾器類是具體處理者(Concrete Handler角色 HttpSecueiry客戶類角色。

本文由博客一文多發(fā)平臺 OpenWrite 發(fā)布!

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容