讲究门面的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();
}
}
喜欢研究java的同学可以交个朋友,下面是本人的微信号:
讲究门面的Request的更多相关文章
- django的views里面的request对象详解大全
简介 HTTP 应用的信息是通过 请求报文 和 响应报文 传递的,关于更多的相关知识,可以阅读<HTTP权威指南>获得. 其中 请求报文 由客户端发送,其中包含和许多的信息,而 djang ...
- 75篇关于Tomcat源码和机制的文章
75篇关于Tomcat源码和机制的文章 标签: tomcat源码机制 2016-12-30 16:00 10083人阅读 评论(1) 收藏 举报 分类: tomcat内核(82) 版权声明:本文为 ...
- 连接器与容器的桥梁——CoyoteAdapter
如果把整个tomcat内核最高抽象程度模块化,可以看成是由连接器Connector和容器Container组成,连接器负责HTTP请求接收及响应,生成请求对象及响应对象并交由容器处理,而容器则根据请求 ...
- request.getParameter(“参数名”) 中文乱码解决方法
今天浏览项目时候,遇到一个问题,页面用${requestScope.参数名 }获取的值是乱码,然后搜了一下,最后说是编码的问题,附上查找的结果: 在Java 开发中,如果框架搭建的不完善或者初学者在学 ...
- response.sendRedirect()与request.getRequestDispatcher().forward()区别
Servlet中response.sendRedirect()与request.getRequestDispatcher().forward(request,response)这两个对象都可以使页面跳 ...
- 【转】request和response的页面跳转传参
下面是一位园友的文章: jsp或Servlet都会用到页面跳转,可以用 request.getRequestDispatcher("p3.jsp").forward(request ...
- oracle ebs request一直pending
如果提交请求以后,状态一直是pending状态,可以在“工具”打开“Manager”,查看一下Maximum是否有设置错,另外pending的数量当前是多少. 如果Maximum是1,pending是 ...
- request的生命周期
有如下功能: 从index.jsp页面点击超链接进入TestServlet服务器,TestServlet服务器再请求转发到test.jsp. 在index.jsp里设置了request的attribu ...
- 转response.sendRedirect()与request.getRequestDispatcher().forward()区别
JSP中response.sendRedirect()与request.getRequestDispatcher().forward(request,response)这两个对象都可以使页面跳转,但是 ...
随机推荐
- ubuntu linux c学习笔记----共享内存(shmget,shmat,shmdt,shmctl)
shmget int shmget(key_t key, size_t size, int flag); key: 标识符的规则 size:共享存储段的字节数 flag:读写的权限 返回值:成功返回共 ...
- 毕业设计-JSP论文盲审系统
之前做的一款jsp的论文盲审系统,ssh框架的,学生提交论文,系统管理员将论文分配给教员,教员在不知学员是谁的情况之下,对论文进行打分,然后提交给系统,最后系统发布成绩,供学员查看. 整体做的还不错, ...
- Python中模块之os的功能介绍
Python中模块之os的功能介绍 1. os的变量 path 模块路径 方法:os.path 返回值:module 例如:print(os.path) >>> <module ...
- K-means聚类 的 Python 实现
K-means聚类 的 Python 实现 K-means聚类是一个聚类算法用来将 n 个点分成 k 个集群. 算法有3步: 1.初始化– K 个初始质心会被随机生成 2.分配 – K 集群通过关联到 ...
- Tensorflow 基于分层注意网络的文件分类器
After the exercise of building convolutional, RNN, sentence level attention RNN, finally I have come ...
- 数据结构 栈&队列
2-4 依次在初始为空的队列中插入元素a,b,c,d以后,紧接着做了两次删除操作,此时的队头元素是( ) 删除,移动头指针: 增加,移动尾指针: 删除a,b ,队头c 2-3 在一个链队列中,fron ...
- left join 连表时,on后多条件无效问题
http://www.cnblogs.com/guixiaoming/p/6516261.html left join 连表时,on后多条件无效问题 最近开发素材库项目,各种关系复杂的表,一度6张表的 ...
- 判断是否是IE9浏览器的最短语句 var ie=!-[1,]
没错,上面这个语句就可以判断浏览器是不是IE9以下的.why?1.[1,]在现代浏览器(ie包括ie9及以上)会被转换成[1], 而ie9以下就会转换成[1,undefined].2.分别对[1],和 ...
- 再谈RunLoop
RunLoop 一 概述: 一句话解释RunLoop:运行任务的循环. 为什么要有RunLoop:解决交互式UI设计中的一个问题,如何快速响应用户输入,如何快速将程序运行结果输出到屏幕? 计算机是个笨 ...
- MySQL 数学函数
MySQL 数学函数 所有的数学函数在发生错误的情况下,均返回 NULL. -元减.改变参数的符号 mysql> SELECT - 2; -> -2 注意,如果这个操作符被用于一个 BIG ...