为什么说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();

}

}

喜欢研究java的同学可以交个朋友,下面是本人的微信号:

讲究门面的Request的更多相关文章

  1. django的views里面的request对象详解大全

    简介 HTTP 应用的信息是通过 请求报文 和 响应报文 传递的,关于更多的相关知识,可以阅读<HTTP权威指南>获得. 其中 请求报文 由客户端发送,其中包含和许多的信息,而 djang ...

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

    75篇关于Tomcat源码和机制的文章 标签: tomcat源码机制 2016-12-30 16:00 10083人阅读 评论(1) 收藏 举报  分类: tomcat内核(82)  版权声明:本文为 ...

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

    如果把整个tomcat内核最高抽象程度模块化,可以看成是由连接器Connector和容器Container组成,连接器负责HTTP请求接收及响应,生成请求对象及响应对象并交由容器处理,而容器则根据请求 ...

  4. request.getParameter(“参数名”) 中文乱码解决方法

    今天浏览项目时候,遇到一个问题,页面用${requestScope.参数名 }获取的值是乱码,然后搜了一下,最后说是编码的问题,附上查找的结果: 在Java 开发中,如果框架搭建的不完善或者初学者在学 ...

  5. response.sendRedirect()与request.getRequestDispatcher().forward()区别

    Servlet中response.sendRedirect()与request.getRequestDispatcher().forward(request,response)这两个对象都可以使页面跳 ...

  6. 【转】request和response的页面跳转传参

    下面是一位园友的文章: jsp或Servlet都会用到页面跳转,可以用 request.getRequestDispatcher("p3.jsp").forward(request ...

  7. oracle ebs request一直pending

    如果提交请求以后,状态一直是pending状态,可以在“工具”打开“Manager”,查看一下Maximum是否有设置错,另外pending的数量当前是多少. 如果Maximum是1,pending是 ...

  8. request的生命周期

    有如下功能: 从index.jsp页面点击超链接进入TestServlet服务器,TestServlet服务器再请求转发到test.jsp. 在index.jsp里设置了request的attribu ...

  9. 转response.sendRedirect()与request.getRequestDispatcher().forward()区别

    JSP中response.sendRedirect()与request.getRequestDispatcher().forward(request,response)这两个对象都可以使页面跳转,但是 ...

随机推荐

  1. 基于 HTML5 的 WebGL 3D 智能楼宇监控系统

    前言 智能监控的领域已经涉及到了各大领域,工控.电信.电力.轨道交通.航天航空等等,为了减少人员的消耗,监控系统必不可少.之前我写过一篇 2D 的智能地铁监控系统广受好评,突然觉得,既然 2D 的这么 ...

  2. java continue与break区别

    在循环体中跳出循环语句有continue与break语句 continue:跳出本次循环,包括本次循环continue后面的语句, break:跳出循环体,就是说一遇到break循环就结束. 代码: ...

  3. WINFORM中treeview 节点显示不全

    在设置treeview节点时,出现如下显示不全的问题: 这个问题是由于我们在treeview任务中编辑节点时设置的字体大于我们在treeview属性中设置frot字体导致的. 所以只要将treevie ...

  4. JSON.parse(),JSON.stringify(),jQuery.parseJSON()

    http://www.jb51.net/article/29893.htm http://www.jb51.net/article/87642.htm

  5. linux设置oracle自动启动

    用root用户 在/etc/init.d/目录下创建Oracle的服务文件 cd /etc/init.d vi oracle11g   添加内容如下   #!/bin/bash # chkconfig ...

  6. Postgresql合并年月日、月份和日期左侧补零

    在写一个统计查询的 SQL 语句时,需要根据年.月.日分组,但要求返回的字段是日期格式:yyyy年MM月dd日.刚开始我的做法是返回年.月.日,然后再手动拼接年月日,而且还要判断月份和日期是否为个位数 ...

  7. 我的博客地址和github地址

    博客地址 http://www.cnblogs.com/sjzsjzsjz/ github地址  https://github.com/sjzsjzsjz

  8. npm ERR! Windows_NT 10.0.10586

    安装vue脚手架时候一直失败,如图: npm cache clean 管理员下安装: 快捷键 win +x , 按A进入:

  9. 将jdbc连接明文密码加密方案

    最近没有及时写文章,把最近处理的几个问题集中了一下写出来.这篇文章是关于如何处理spring项目中引入数据库连接等 使用的用户名和密码的明文进行加密.防止被他人窃取利用. 我们选择的加密方式为DES加 ...

  10. Spring-cloud(六) Hystrix入门

    前提 一个可用的Eureka注册中心(文中以之前博客中双节点注册中心,不重要) 一个连接到这个注册中心的服务提供者 快速入门 项目搭建 搭建一个新maven项目,artifactid为Ribbon-c ...