設計模式-責任鏈模式

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

責任鏈模式也叫職責鏈模式。

在責任鏈模式中,客戶只需要將請求發送到責任鏈上即可,無須關心請求的處理細節和請求的傳遞過程,所以責任鏈將請求的發送者和請求的處理者解耦了。

責任鏈模式是一種對象行為型模式,其主要優點如下。 降低了對象之間的耦合度。該模式使得一個對象無須知道到底是哪一個對象處理其請求以及鏈的結構,發送者和接收者也無須擁有對方的明確信息。 增強了系統的可擴展性??梢愿鶕枰黾有碌恼埱筇幚眍?,滿足開閉原則。 增強了給對象指派職責的靈活性。當工作流程發生變化,可以動態地改變鏈內的成員或者調動它們的次序,也可動態地新增或者刪除責任。 責任鏈簡化了對象之間的連接。每個對象只需保持一個指向其后繼者的引用,不需保持其他所有處理者的引用,這避免了使用眾多的 if 或者 if···else 語句。 責任分擔。每個類只需要處理自己該處理的工作,不該處理的傳遞給下一個對象完成,明確各類的責任范圍,符合類的單一職責原則。

模式結構

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

源碼導讀

spring security 中其核心設計模式就是責任鏈模式;它通過注冊過濾器鏈來實現責任鏈模式,每個過濾器鏈都只做一件事。springSecurity的責任鏈順序如下

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

SecurityContextPersistenceFilter:在每次請求處理之前將該請求相關的安全上下文信息加載到SecurityContextHolder中,然后在該次請求處理完成之后,將SecurityContextHolder中關于這次請求的信 息存儲到一個“倉儲”中,然后將SecurityContextHolder中的信息清除 例如在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客戶類角色。

本文由博客一文多發平臺 OpenWrite 發布!

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,622評論 6 544
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,716評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事?!?“怎么了?”我有些...
    開封第一講書人閱讀 178,746評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,991評論 1 318
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,706評論 6 413
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 56,036評論 1 329
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 44,029評論 3 450
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 43,203評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,725評論 1 336
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,451評論 3 361
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,677評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,161評論 5 365
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,857評論 3 351
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,266評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,606評論 1 295
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,407評論 3 400
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,643評論 2 380

推薦閱讀更多精彩內容

  • 目錄 本文的結構如下: 引言 什么是責任鏈模式 模式的結構 典型代碼 代碼示例 純與不純的責任鏈模式 優點和缺點 ...
    w1992wishes閱讀 1,269評論 4 14
  • 定義 責任鏈模式是一種對象的行為模式。在責任鏈模式中,很多對象由每一個對象對其下家的引用而連接起來形成一條鏈。請求...
    步積閱讀 2,069評論 1 5
  • 本文內容思維導圖如下: 一、責任鏈模式介紹 責任鏈模式定義:為請求創建一個處理此請求對象的鏈。 適用場景(核心):...
    我叫劉半仙_liugh閱讀 704評論 0 4
  • 古代婦女的枷鎖——"三從四德" 這里"三從"是指"未嫁從父、既嫁從夫、夫死從子"。舉例來說,如果一位女性要出去逛街...
    stayiwithime閱讀 636評論 0 0
  • 他覺得自己被冷落了。沒有被關注的感覺,他在想什么。不知道,沒人可以明白他的問題。在他的內心,沒有被理解的一切。看著...
    鹿鹿無畏閱讀 669評論 0 50