github地址:https://github.com/1711680493 点我进入github 如需了解更多设计模式,请进入我的设计模式专栏 委派模式 委派模式不是23设计模式中的一种. 与策略模式很相似. 拥有以下三种角色 抽象任务角色 委派者角色 具体任务角色 委派模式,就是将任务发给委派者角色,委派者角色去委派具体任务角色 委派模式对外隐藏了具体实现,仅将委派者角色暴露给外部 委派模式和策略模式不同的是 ,委派者角色和具体任务角色都要继承/实现抽象任务角色 Spring框架很多地方用到了委派模式,例如 Dispatcher(转发) 代码实现 /** * 委派模式 * @author Shendi < ); } /** * 委派者 * @author Shendi <a href='tencent://AddContact/?
14.委派模式 14.1.课程目标 1 、掌握委派模式, 精简程序逻辑, 提升代码的可读性。 2、学会用模板方法模式梳理使用工作中流程标准化的业务场景。 14.2.内容定位 1 、希望通过对委派模式的学习,让自己写出更加优雅的代码的人群。 2、深刻了解模板方法模式的应用场景。 委派模式属于行为型模式, 不属于GO F 23 种设计模式中。 14.4.委派模式的应用场景 委派模式在 Spring 中应用非常多 , 大家常用的 DispatcherServlet 其实就是用到了委派模式。先来看一下类图: ? 2.思考:模板模式除了继承以外,还有哪些实现方式? Java8新特性接口default方法 匿名内部类实现 静态代理、组合模式、装饰器模式
在各种不足中,也还是有一些收获的,比如锁粒度的优化,分级锁的使用,会话的公平分配,注解校验接口参数,MySQL查询优化等等, 但是今天要聊的是在项目中使用的一种设计模式:委派者模式。 在很久之前自己也整理了23种设计模式(18年的时候写的,现在仍然放在公众号里面,好坏就不说了),但是在日常开发中,设计模式还是很少结合实际去运用, 自己熟悉且常用的设计模式无非就是单例,策略,代理这三种 23种设计模式分为创建型模式,结构型模式和行为型模式,我们要说的委派者模式并不在23种设计模式中,它的功能核心是任务的调用和分配任务, 这种模式中主要包含了三种角色: 抽象任务角色, 委派者角色, 具体任务角色 我们熟知具体的应用: Spring MVC 中的 DispatcherServlet 根据 handlerMapping 转发具体执行逻辑到 Controller就是使用委派者模式 下面来谈一谈这种设计模式的使用 GroupChatInfoDo groupChatInfoDo) { System.out.println("挂起动作"); } } 第二步: 将动作封装成枚举(也可以使用策略模式来避免委派者模式违背开闭原则
今天我给大家分享设计模式中的委派模式。用贴切的生活故事,以及真实项目场景来讲设计模式,最后用一句话来总结这个设计模式。 故事 从字面意义上来看,委派:指委托安排;委任派遣 。 在我们技术领域有个模式也叫委派模式,但委派模式不属于GOF的23种模式,但由于其性质和作用,大家都把委派模式归纳在行为模式中。 在楚汉传奇中,刘邦当时封韩信为大将军时,下面很多人非常不服。 委派模式的定义 委派模式:英文Delegate Pattern,它的基本作用就是负责任务的调度和分配任务。 在这里需要注意,委派模式和代理模式非常相似,可以把委派模式看作为一种特殊情况下的静态代理的全权代理。 代理模式:重点在于过程。委派模式:重点在于结果。 这边是一个非常典型的委派模式的应用场景。 用一张图表示: ?
而上述两点,构成了本文接下来要讲述的知识点:委派模式。三、委派模式从上文中,我们从SLF4J的案例,引出了"委派模式"这个概念,下面我们就重点讨论委派模式(delegation)。 接下来我们按照认知流程,依次从三个问题,解释委派模式:为什么使用委派模式什么是委派模式如何使用委派模式然后会在下一章,用业内的典型案例,分析委派模式的使用情况。3.1 为什么采用委派模式? 综上而言:委派模式是基于当前软件领域的协作特性,采取的较好的软件结构模式。所以啥时候采用委派模式呢? 3.3 如何使用委派模式在使用委派模式之前,先根据上文的模式匹配条件进行自我判断:存在设定某个标准并由中心化团队负责的必要使用者有强烈的需求自定制某些局部实现如果并不符合条件一,那么就不需要考虑使用委派模式 委派模式的隐藏机制:实现方式的注册/发现。
委派是域中的一种安全设置,可以允许某个机器上的服务代表某个用户去执行某个操作,主要分为三种: 1、非约束性委派 2、约束性委派 3、基于资源的约束性委派 这篇文章主要对这三种委派方式相关的攻击进行详解 2的RST(服务访问票据) KDC给服务1返回服务2的RST 服务1以用户名义向服务2发出请求 服务2响应服务1的请求 服务1响应用户第7步骤的请求 这个流程有一个问题:TGT2是不被限制的,服务1完全可以用它来请求访问任何想访问的服务 Delegation)即 Kerberos 的扩展协议 S4U2Proxy,服务账号只能获取某用户的 TGS ,从而只能模拟用户访问特定的服务,这也相对应非约束委派更安全一些。 不同于允许委派所有服务的非约束委派,约束委派的目的是在模拟用户的同时,限制委派机器/帐户对特定服务的访问。 S4U2self: (1) 用户向 service1 发送请求。 基于资源的约束委派只能在运行 Windows Server 2012 和 Windows Server 2012 R2 及以上的域控制器上配置,但资源的约束委派可以跨域森林和跨域。
委派是域中的一种安全设置,可以允许某个机器上的服务代表某个用户去执行某个操作,在域中只有机器帐户何服务帐户拥有委派属性,也就是说只有这两类帐户可以配置域委派,分为三种: 非约束委派 约束委派 基于资源的约束性委派 (4)KDC 在 KRB_TGS_REP 消息中为用户返回一个转发的 TGT 2,该 TGT 2 用于后续访问服务2(Service 2)使用。 Service 1 使用转发的 TGT 2 并将其通过 KRB_TGS_REQ 消息发送到 KDC,以用户的名义请求 Service 2 的 ST 2。 由于非约束委派的不安全性,微软在windows server 2003以后引入了约束委派,引入了S4U(s4u2self,s4u2proxy),运行服务代表用户向KDC请求票据 s4u2self(service Service 1 需要以用户身份访问 Service 2 上的资源。但是,Service 1 没有来自用户的可转发 TGT ,因此不能通过非约束委派中转发 TGT 的方式执行委派。
getClass()); System.out.println(obj2 instanceof com.jvm.classloading.ClassLoaderTest); } main函数的第一部分使用系统加载主类ClassLoaderTest的类加载器加载ClassLoaderTest,输出显示,obj1的所属类型检查正确,这是虚拟机中有2个ClassLoaderTest类 此时虚拟机中有3个ClassLoaderTest类,由于第3个类的类加载器与前面2个类加载器不同,虽然来源于同一个Class文件,但它是一个独立的类,所属类型检查是返回结果自然是false。 2 双亲委派模型 2.1 类加载器种类 2.1.1 Java虚拟机的角度 启动类加载器(Bootstrap ClassLoader),这个类加载器使用C++语言实现(HotSpot虚拟机中),是虚拟机自身的一部分 使用双亲委派模型的好处在于Java类随着它的类加载器一起具备了一种带有优先级的层次关系 例如类java.lang.Object,它存在于rt.jar中,无论哪一个类加载器要加载这个类,最终都是委派给处于模型最顶端的
本文节选自《设计模式就该这样学》 1 使用委派模式模拟任务分配场景 我们用代码来模拟老板给员工分配任务的业务场景。首先创建IEmployee员工接口。 2 委派模式在JDK源码中的应用 JDK中有一个典型的委派,众所周知,JVM在加载类时用双亲委派模型,这又是什么呢?一个类加载器在加载类时,先把这个请求委派给自己的父类加载器去执行。 3 委派模式在Spring源码中的应用 下面来看委派模式在Spring中的应用,Spring IoC模块中的DefaultBeanDefinitionDocumentReader类,当调用doRegisterBeanDefinitions 再来还原一下Spring MVC的DispatcherServlet是如何实现委派模式的。创建业务类MemberController。 当然,在Spring中运用委派模式的情况还有很多,大家通过命名就可以识别。在Spring源码中,只要以Delegate结尾的都实现了委派模式。
目录 一、前言 二、双亲委派 2.1、为什么需要双亲委派 2.2、双亲委派的实现 三、破坏双亲委派 3.1、为什么需要破坏双亲委派? 前段时间,笔者同事提出了一个关于类加载器破坏双亲委派的问题,以我们常见到的数据库驱动Driver为例,为什么要实现破坏双亲委派,下面一起来重温一下。 二、双亲委派 想要知道为什么要破坏双亲委派,就要先从什么是双亲委派说起,在此之前,我们先要了解一些概念: 对于任意一个类,都需要由加载它的类加载器和这个类本身来一同确立其在Java虚拟机中的唯一性。 3.1、为什么需要破坏双亲委派? 3.2、破坏双亲委派的实现 我们结合Driver来看一下在spi(Service Provider Inteface)中如何实现破坏双亲委派。
为什么要研究双亲委派机制? 研究类加载的过程就是要知道类加载的时候使用了双亲委派机制。但仅仅知道双亲委派机制不是目的,目的是要了解为什么要使用双亲委派机制,他的原理是什么? 再比如:双亲委派机制的实现使用了责任链设计模式,我们借此可以研究一下责任链设计模式,这样就理解了委派的原理。那么哪些场景我们可以使用责任链设计模式呢?多思考,才是学习的目的和精髓所在。 【通过分析,我们可以得出,双亲委派机制的实现使用的是责任链设计模式。】 那么, 这里有一个问题, 那就是, 由应用程序类加载器首先加载, 然后最后又回到了应用程序类加载器. return super.loadClass(var1, var2); } } 看注释部分,我们知道这是双亲委派机制里的第一步,现在AppClassLoader中查找,先从已经加载过的类中查找,如果找到就直接返回 return super.loadClass(var1, var2); } 首次加载调用了super.loadClass(var1,var2), 而这个super是谁呢?
本文节选自《设计模式就该这样学》 1 使用委派模式模拟任务分配场景 我们用代码来模拟老板给员工分配任务的业务场景。 首先创建IEmployee员工接口。 [file] 2 委派模式在JDK源码中的应用 JDK中有一个典型的委派,众所周知,JVM在加载类时用双亲委派模型,这又是什么呢?一个类加载器在加载类时,先把这个请求委派给自己的父类加载器去执行。 3 委派模式在Spring源码中的应用 下面来看委派模式在Spring中的应用,Spring IoC模块中的DefaultBeanDefinitionDocumentReader类,当调用doRegisterBeanDefinitions 再来还原一下Spring MVC的DispatcherServlet是如何实现委派模式的。创建业务类MemberController。 当然,在Spring中运用委派模式的情况还有很多,大家通过命名就可以识别。在Spring源码中,只要以Delegate结尾的都实现了委派模式。
前段时间,笔者同事提出了一个关于类加载器破坏双亲委派的问题,以我们常见到的数据库驱动Driver为例,为什么要实现破坏双亲委派,下面一起来重温一下。 二、双亲委派 想要知道为什么要破坏双亲委派,就要先从什么是双亲委派说起,在此之前,我们先要了解一些概念: 对于任意一个类,都需要由加载它的类加载器和这个类本身来一同确立其在Java虚拟机中的唯一性。 2.2、双亲委派的实现 双亲委派的实现其实并不复杂,其实就是一个递归,我们一起来看一下ClassLoader里的代码: protected Class<? 3.1、为什么需要破坏双亲委派? 3.2、破坏双亲委派的实现 我们结合Driver来看一下在spi(Service Provider Inteface)中如何实现破坏双亲委派。
双亲委托有个弊端: 不能向下委派,不能不委派 怎么打破双亲委派机制:(也就是能向下委派和不委派) 自定义类加载器(不委派) spi机制(向下委派) 打破双亲委派 打破双亲委派的两种方式: 1.通过spi 机制,使用ServiceLoader.load去加载 2.通过自定义类加载器,继承classloader,重写loadclass方法 SPI机制 spi机制是一种服务发现机制。 由于双亲委派模型,父加载器是拿不到通过子加载器加载的类的。这个时候就需要启动类加载器来委托子类来加载Driver实现,从而破坏了双亲委派。 HelloService{ @Override public String getName() { return "hello1"; } } public class Hello2 implements HelloService{ @Override public String getName() { return "hello2"; } }
redteam.red 靶场 委派攻击分类: 1、非约束性委派 2、约束性委派 3、基于资源的约束性委派 关于约束委派与非约束委派 委派(Delegation)是指将用户或计算机帐户的权限授予其他用户或计算机帐户 利用场景 攻击者拿到了一台配置非约束委派的机器权限,可以诱导域管来访问该机器,然后得到管理员的TGT,从而模拟域管用户 复现配置 1、信任此计算机来委派任何服务(域控DC) 2、setspn /body> </html> 2、导出票据到本地 mimikatz sekurlsa::tickets /export 非约束委派-域成员钓鱼域控窃取票据 3、导入票据到内存 mimikatz kerberos User to Self (S4U2Self)和 Service for User to Proxy (S4U2proxy)。 复现配置 1、机器设置仅信任此计算机指定服务-cifs 2、用户设置仅信任此计算机指定服务-cifs 这里搭建环境稍微麻烦一点, 判断查询 查询机器用户(主机)配置约束委派 AdFind
双亲委派 ClassLoader 传递性 使用调用者 Class 对象的ClassLoader加载。
类加载器双亲委派模型图 双亲委派模型构成 启动类加载器 扩展类加载器 应用程序类加载器 自定义类加载器 双亲委派模型工作过程是 如果一个类加载器收到类加载的请求,它首先不会自己去尝试加载这个类,而是把这个请求委派给父类加载器完成 为什么需要双亲委派模型? 如果没有双亲委派,那么用户是不是可以自己定义一个java.lang.Object的同名类、java.lang.String的同名类,等等,并把它放到ClassPath中,那么类之间的比较结果及类的唯一性将无法保证 因此,双亲委派模型可以防止内存中出现多份同样的字节码。
继续再次加载Application ClassLoader 应用类加载器,即系统即在此,加载当前应用下的类 最后再次加载ClassLoader类 双亲委派模型 该模型是先检查指定名称的类是否已经加载过,
双亲委派模型(Parents Delegation Model) 类加载器 启动类加载器 拓展类加载器 应用程序类加载器 注意: 不是用继承,而是用组合去实现 参考 详谈双亲委派机制
约束委派 接上述的非约束委派,由于非约束委派的不安全性,微软在windows2003中发布了约束委派的功能。 这里包括一组名为S4U2Self(Service for User to Self)和S4U2Proxy(Service for User to Proxy)的Kerberos协议扩展。 Service2的ST(称之为ST2)。 8.service1代表用户使用ST2请求访问Service2 9.Service2响应Service1的请求 10.Service1将Service2的响应转发给User。 为win2016用户配置约束委派,做win2 019机器的cifs服务的委派 图片 图片 此时应用设置后,已在域中完成了win2016用户对win2019机器的cifs服务的委派 发现约束委派