讲究门面的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内核设计剖析》



目录
相关文章
|
5月前
|
XML Java API
深入谈谈API接口的作用
深入谈谈API接口的作用
|
8月前
|
设计模式 人工智能 前端开发
彻底说透简单工厂那些你没有关注过的细节
接下来看代码,还是以创建一门网络课程为例。假设有Java架构、大数据、人工智能等课程,已经形成了一个生态。我们可以定义一个课程标准ICourse接口。
38 0
|
8月前
|
设计模式 数据安全/隐私保护
这才是责任链模式的优雅使用方式
首先创建一个实体类Member。
63 0
|
数据库
eggjs 怎么实现获取用户信息接口?
eggjs 怎么实现获取用户信息接口?
114 0
eggjs 怎么实现获取用户信息接口?
|
Web App开发 JSON 前端开发
【低效编码】一个@ResponseBody注解没加让我这个菜鸟原形毕露
您好,我是码农飞哥,感谢您阅读本文!如果此文对您有所帮助,请毫不犹豫的一键三连吧。小伙伴们,有啥想看的,想问的,欢迎积极留言告诉我喔。 。
124 0
【低效编码】一个@ResponseBody注解没加让我这个菜鸟原形毕露
|
编解码 负载均衡 Java
【Fegin技术专题】「原生态」从源码层面让你认识Feign工作流程和运作机制
【Fegin技术专题】「原生态」从源码层面让你认识Feign工作流程和运作机制
148 0
【Fegin技术专题】「原生态」从源码层面让你认识Feign工作流程和运作机制
uniapp封装request请求(有需要看着改就行)
uniapp封装request请求(有需要看着改就行)
248 0
|
存储 缓存 UED
接口测试开发之:一篇搞懂 Cache、Cookie及Session的爱恨情仇
接口测试开发之:一篇搞懂 Cache、Cookie及Session的爱恨情仇
139 1
接口测试开发之:一篇搞懂 Cache、Cookie及Session的爱恨情仇
|
前端开发
前端工作总结225-封装request做数据请求
前端工作总结225-封装request做数据请求
58 0
封装两种习惯使用request
最近在学习Vue3,现在来说一下自己的学习感受,并且分享一些小知识点。 > 可能这些知识点并不是那么属于Vue3的知识范畴,但是这是我在学习过程中遇到并且记录下来的,对于我而言,是Vue3让我遇到了这些知识,哈哈哈哈,我就这么归类辣!