讲究门面的Request

简介: 为什么说Request讲究门面?注意这里所说的门面并非我们常理解的外表的意思,其实是说它使用了门面设计模式,门面的使用主要用于数据安全的考虑。一个大的系统体系的多个子系统之间涉及交互通信、一个系统中的多个子组件之间同样可能涉及数据交互,但考虑到安全问题,某一子系统或子组件不可能把自己内部数据过多地暴露给其他子系统或子组件,这时就要门面模式出马了,将某一子系统或子组件设计成一个门面,把别的子系统或子组件感兴趣的数据进行封装,其他子系统子组件通过此门面完成数据访问。

为什么说Request讲究门面?注意这里所说的门面并非我们常理解的外表的意思,其实是说它使用了门面设计模式,门面的使用主要用于数据安全的考虑。一个大的系统体系的多个子系统之间涉及交互通信、一个系统中的多个子组件之间同样可能涉及数据交互,但考虑到安全问题,某一子系统或子组件不可能把自己内部数据过多地暴露给其他子系统或子组件,这时就要门面模式出马了,将某一子系统或子组件设计成一个门面,把别的子系统或子组件感兴趣的数据进行封装,其他子系统子组件通过此门面完成数据访问。就如下图,其他系统或组件通过一个门面Façade去访问子系统或子组件,Façade实现了对数据安全的控制,对于敏感数据不提供任何访问通道,而非敏感数据则直接暴露供访问。


根据门面模式往下看看tomcat中的请求对象为什么要讲究门面。直接用个类图说明更加清晰,上面两个请求ServletRequest与HttpServletRequest都是Servlet规范标准定义的接口,它们为继承关系,这些接口定义的方法专门暴露给web开发者调用;RequestFacade就是门面了,它将实现所有HttpServletRequest接口定义的方法,具体的实现依赖于连接器的Request;连接器的Request主要是供tomcat内核使用,考虑到安全问题并不可把所有数据暴露给web开发人员;最后到最底层的请求对象,(coyote)Request封装的是最底层的数据,即Socket通信的所有字节数组,连接器Request是对此请求对象进行一定加工处理后的对象。


给出一个简单的例子:

①   CoyoteRequest类,假设它拥有http协议头部属性的contentLength,此属性可暴露给web开发人员。

public final class CoyoteRequest {

   private int contentLength = 200;

   public int getContentLength(){

             return contentLength;

   }

}

 

②   ConnectorRequest类,其中的connector是tomcat内部组件,不可暴露给web开发人员。

public class ConnectorRequest implements HttpServletRequest{

       protected CoyoteRequest coyoteRequest;

       protected Connector connector;

 

       public void setCoyoteRequest(CoyoteRequestcoyoteRequest) {

                this.coyoteRequest =coyoteRequest;

       }

       public Connector getConnector() {

                return connector;

       }

       public void setConnector(Connectorconnector) {

                this.connector = connector;

       }

       public int getContentLength() {

                return coyoteRequest.getContentLength();

       }

}

 

③   RequestFacade类,充当门面类,屏蔽不可暴露的方法getConnector(),保证了Connector组件不被web开发人员获取。

public class RequestFacade implements HttpServletRequest{

       protected ConnectorRequestconnectorRequest;

 

publicRequestFacade(ConnectorRequest connectorRequest) {

                this.connectorRequest =connectorRequest;

       }

       public int getContentLength() {

                returnconnectorRequest.getContentLength();

       }

}


点击订购作者《Tomcat内核设计剖析》



目录
相关文章
|
4月前
|
设计模式
二十三种设计模式全面解析-职责链模式的高级应用-日志记录系统
二十三种设计模式全面解析-职责链模式的高级应用-日志记录系统
|
4月前
|
设计模式 缓存
二十三种设计模式全面解析-代理模式(Proxy Pattern)详解:探索隐藏于背后的力量
二十三种设计模式全面解析-代理模式(Proxy Pattern)详解:探索隐藏于背后的力量
|
4月前
|
设计模式
二十三种设计模式全面解析-职责链模式(Chain of Responsibility Pattern):解放代码责任链,提升灵活性与可维护性
二十三种设计模式全面解析-职责链模式(Chain of Responsibility Pattern):解放代码责任链,提升灵活性与可维护性
|
4月前
|
设计模式
二十三种设计模式全面解析-解密职责链模式:请求处理的设计艺术
二十三种设计模式全面解析-解密职责链模式:请求处理的设计艺术
|
4月前
|
运维 网络架构 索引
SSM整合-异常处理器及项目异常处理方案
SSM整合-异常处理器及项目异常处理方案
38 0
|
5月前
|
存储 NoSQL MongoDB
变形记---抽象接口,屎山烂代码如何改造成优质漂亮的代码
在游戏服务器开发过程中,我们经常会在动手码代码之前好好的设计一番,如何设计类,如何设计接口,如何调用,有没有什么隐患,在这些问题考虑评审可以Cover现阶段的需求的情况下再动手。不过,对于一些初级,甚至中高级开发者,仍然不可避免的进入了一个死胡同,缺少设计,屎山代码堆积,越堆越臭,越写越烂,直到很难维护必须要重新改造。最近我给M部门面试服务器主程序开发的职位,我不问开发语言的语法,我只问他们的架构设计经验,我发现相当一部分5-12年“本应该有足够开发经验。
|
8月前
|
设计模式 数据安全/隐私保护
这才是责任链模式的优雅使用方式
首先创建一个实体类Member。
61 0
|
9月前
|
缓存 前端开发 安全
告别混乱代码:SpringBoot 后端接口规范
告别混乱代码:SpringBoot 后端接口规范
958 0
|
12月前
|
测试技术 持续交付 微服务
09 微服务接口:怎么用Mock解决混乱的调用关系?
09 微服务接口:怎么用Mock解决混乱的调用关系?
封装两种习惯使用request
最近在学习Vue3,现在来说一下自己的学习感受,并且分享一些小知识点。 > 可能这些知识点并不是那么属于Vue3的知识范畴,但是这是我在学习过程中遇到并且记录下来的,对于我而言,是Vue3让我遇到了这些知识,哈哈哈哈,我就这么归类辣!