设计模式-责任链模式

责任链(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客户类角色。
点击关注个人博客

相关文章
相关标签/搜索