讲究门面的Request

时间:2023-01-13 16:25:20

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

讲究门面的Request

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

讲究门面的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