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

时间: 2024-11-15 23:26:05

讲究门面的Request的相关文章

75篇关于Tomcat源码和机制的文章

整理下前面写过的75篇关于Tomcat源码和机制的文章 文章列表 如何设计一个Web容器 Web安全认证机制知多少 Tomcat集群实现源码级别剖析 Tomcat集群如何同步会话 从单机到集群会话的管理之集群模式一 从单机到集群会话的管理之集群模式二(更大的集群) Tomcat集群的failover机制 Tomcat集群应用部署的实现机制 Tomcat集群机制剖析及其生产部署选型 Tomcat如何实现WebSocket Tomcat如何实现Comet Tomcat怎么实现异步Servlet To

连接器与容器的桥梁——CoyoteAdapter

如果把整个tomcat内核最高抽象程度模块化,可以看成是由连接器Connector和容器Container组成,连接器负责HTTP请求接收及响应,生成请求对象及响应对象并交由容器处理,而容器则根据请求路径找到相应的servlet进行处理.请求响应对象从连接器传送到容器需要一个桥梁,这个桥梁正是此节讨论的主角--CoyoteAdapter. 这个组件的结构非常简单,仅仅包含两个工具类,URLEncoder负责对字符串URL编码,StringManager负责日志的国际化,这两个工具前面已详细介绍过

国际家居网总编辑黄相如讲网站运营

[BiaNews消息]4月10日,国际家居网创始人黄相如做客网络编辑第一社区www.bianews.com.在访谈中,黄总为我们分享了他创立的国际家居网运营模式,他告诉我们国际家居网的定位跟其他网站都不一样,他们不只是行业媒体,而是媒体+电子商务的模式.结合国际家居给我们谈了关于网站运营方面的知识,他坚信网络营销是未来营销的主流方向,优点多.所以把传统营销拓展到网络营销是一个趋势也是必要的.有着数年来互联网从业经历的他,还谈了他对网编进阶的看法,以及他的网编人才观.他希望网编不断地虚心学习,坚持

如何修改request的parameter的几种方式

这篇文章仅仅用来参考,本身不想写,request之所以不想让你修改parameter的值,就是因为这个东西一般不然改,有人问我为什么不让改,表面上说我只能说这属于篡改数据,因为这个使用户的请求数据,如果被篡改就相当于篡改消息,如果你一天给别人发消息发的是:你好,而对方收到的是:fuck you!,你会怎么想,呵呵!当然它主要是怕不安全把参数数据该乱了,因为程序员毕竟是自己写程序,尤其是在公共程序里面写,后台程序员发现自己的数据不对,也找不到原因:一般WEB应用会提供一个attribute来提供自

上传下载中参数 request, 字符串数组 params, Map values

问题描述 上传下载中参数 request, 字符串数组 params, Map values 里面的request,params 和values穿的是什么值 解决方案 用fiddler看下浏览器中传了什么,你照着做好了.

jsp怎么通过一个按钮buttom点击跳转,同时共享request...

问题描述 jsp怎么通过一个按钮buttom点击跳转,同时共享本界面的request啊...通过forward方式都是自动直接跳转的...就是在button中的onclick事件怎么写?? 解决方案 <input type="button" value="Save" name="save" onClick="savebtn('<%=year%>','<%=entity%>','<%=costpool%

java-求助ajax怎么设置request.setattribute

问题描述 求助ajax怎么设置request.setattribute 求助各位大神,有一段前台代码是这样的: <c:forEach var="me" items="${fileNameMap}"> </c:forEach> 现在我想用ajax给items动态赋值,ajax调用的后台代码有一句:request.setattribute("fileNameMap",fileNameMap),问题来了:前台页面怎么也接收不到后

web xml-如何在dao和service中获得session和request

问题描述 如何在dao和service中获得session和request 在DAO层中需要insert一条record,这条record需要记录当前用户(该记录是由谁创建的),对于这样的应用,我们一般可以在Action层中通过request拿到session里的用户账号,然后传入service,再传入DAO层.思路是这个! 可是我们公司,用了一个工具类 public class SessionHelpUtils { /** * @return * @Description:获得当前sessio

jsp Request对象实例教程

在我们会用 Request对象来获取由表单提交过来的数据,这一点有点像asp里面的request获取数据方法. 回收的价值确定在表单字段 主要使用对象的要求是让价值用户提供了形式提交.例如,在此HTML页a.jsp : <% String bUrl = response.encodeUrl("b.jsp"); %> <%-- presentation --%> <form method="post" action="<%