首页 > 系统相关 >内存马基础知识

内存马基础知识

时间:2022-12-02 16:48:20浏览次数:36  
标签:Container Tomcat Request 基础知识 内存 Context 组件 Servlet

javaweb三大组件

java web:Servlet,Filter,Listener

三大组件的各自功能:

  • Servlet:用我的话来讲它就像是一个处理器,它会接受http请求然后把他封装成 HttpServletRequest 和HttpServletResponse 对象,然后进行处理
  • Filter:这是一个双向的拦截器吧,为什么叫双向?它会在request到达servlet之前处理一遍,然后servlet发送response之后到达客户端之前处理一遍,也就像是在客户端和servlet中间的代理一样都要走它哪里走一遍
  • Listener。Application、Session 和 Request 三大对象创建、销毁或者往其中添加、修改、删除属性时自动执行代码的功能组件,有一个直白一点的解释:
    • 事件:一件事情
    • 事件源:事件发生的地方
    • 监听器:一个对象
    • 注册监听:将事件源,事件,监听器,绑定在一起。当事件源上发生某件事情的时候,执行监听器代码

tomcat架构

Tomcat功能

从最开始Tomcat的介绍来看,Tomcat有点像一个Servlet官方一点就是:Tomcat 是 Web 应用服务器,是一个 Servlet/JSP 容器,而 Servlet 容器从上到下分别是 Engine、Host、Context、Wrapper。

image-20221127151422077

顶层架构

来一张顶层架构图

image-20221127140757310

Service主要包含两个部分:Connector和Container。从上图中可以看出 Tomcat 的心脏就是这两个组件,他们的作用如下:

1、Connector用于处理连接相关的事情,并提供Socket与Request和Response相关的转化;
2、Container用于封装和管理Servlet,以及具体处理Request请求;

一个tomcat只能启动一个server但是可以有多个service,,一个Service只有一个Container,但是可以有多个Connectors,代表的就是一个service运行有多个连接

多个connector和一个Container行成一个service,service就可以向提供服务了,但是service是可以有多个的所以就需要有东西来控制service的生产周期,跟k8s的架构有些类似类似在k8s中的(Kubelet 负责维护容器的生命周期)

connecter

作为Tomcat的核心组件之一,它是用来接受客户端发送的请求然后把它一个 Request 和 Response 对象分别用于和请求端交换数据(这里转换的不是Servletrequest()和ServletResponse)

socket 通信
解析处理应用层协议,如将 socket 连接封装成 request 和 response 对象,后续交给 Container 来处理
将 Request 转换为 ServletRequest,将 Response 转换为 ServletResponse
Adapter 组件

由于协议的不同,Tomcat 定义了自己的 Request 类来存放请求信息,但是这个不是标准的 ServletRequest。于是需要使用 Adapter 将 Tomcat Request 对象转成 ServletRequest 对象,然后就能调用容器的 service 方法。
这个组件的作用就是把tomcat的特有的request转化成Servlet的Sservletreques。

Adapter 组件的结构图

image-20221127191238344

Container组件

Container(又名Catalina)用于处理Connector发过来的servlet连接请求,它是容器的父接口,所有子容器都必须实现这个接口,Container 容器的设计用的是典型的责任链的设计模式,它有四个子容器组件构成,分别是:Engine、Host、Context、Wrapper,这四个组件不是平行的,而是父子关系,Engine 包含 Host,Host 包含 Context,Context 包含 Wrapper。

Tomcat 设计了 4 种容器: Engine、Host、Context、Wrapper ,这四种容器是父子关系

  • Engine: 最顶层容器组件,可以包含多个 Host。实现类为 org.apache.catalina.core.StandardEngine
  • Host: 代表一个虚拟主机,每个虚拟主机和某个域名 Domain Name 相匹配,可以包含多个 Context。实现类为 org.apache.catalina.core.StandardHost
  • Context: 一个 Context 对应于一个 Web 应用,可以包含多个 Wrapper。实现类为 org.apache.catalina.core.StandardContext
  • Wrapper: 一个 Wrapper 对应一个 Servlet。负责管理 Servlet ,包括 Servlet 的装载、初始化、执行以及资源回收。实现类为 org.apache.catalina.core.StandardWrapper

image-20221127193248692

Tomcat的类加载机制

由于 Tomcat 中有多个 WebApp 同时要确保之间相互隔离,所以 Tomcat 的类加载机制也不是传统的双亲委派机制。

Tomcat 自定义的类加载器 WebAppClassloader 为了确保隔离多个 WebApp 之间相互隔离,所以打破了双亲委托机制。每个 WebApp 用一个独有的 ClassLoader 实例来优先处理加载。它首先尝试自己加载某个类,如果找不到再交给父类加载器,其目的是优先加载 WEB 应用自己定义的类。

同时为了防止 WEB 应用自己的类覆盖 JRE 的核心类,在本地 WEB 应用目录下查找之前,先使用 ExtClassLoader(使用双亲委托机制)去加载,这样既打破了双亲委托,同时也能安全加载类。

这一点在CommonsBeanutils1链中就有体现,就是它tomcat有自己的

小结

(1)Tomcat中只有一个Server,一个Server可以有多个Service,一个Service可以有多个Connector和一个Container;
(2) Server掌管着整个Tomcat的生死大权;
(4)Service 是对外提供服务的;
(5)Connector用于接受请求并将请求封装成Request和Response来具体处理;
(6)Container用于封装和管理Servlet,以及具体处理request请求;

标签:Container,Tomcat,Request,基础知识,内存,Context,组件,Servlet
From: https://www.cnblogs.com/0x3e-time/p/16944872.html

相关文章

  • Linux如何查看当前占用CPU或内存最多的K个进程
    内存可以使用以下命令查使用内存最多的K个进程方法1:ps-aux|sort-k4nr|head-K如果是10个进程,K=10,如果是最高的三个,K=3说明:ps-aux中(a指代a......
  • 收藏:linux中查看内存泄露的工具
    来自极客时间的讲座中,提到linux中查看内存泄露的工具:memleak.1.使用方式memleak-a-p$(pidofapp)# -a表示显示每个内存分配请求的大小以及地址#-p指定案例应用的P......
  • 类的内存结构(一)
    类的内存结构包含什么?静态成员变量和静态成员函数是不会计算在类的内存结构中的,因为静态static决定了它们早在编译期就确定了静态变量区中的地址,因此通常来说类的内存结......
  • 使用批处理扫描局域网内存活的主机的脚本
    1、先在电脑任意位置下新建一个txt的文本,然后命名为“扫描局域网内存活的主机.bat”的bat文件。  2、右键该文件,选择"编辑",把以下内容复制进去,最后保存。 @echooff......
  • 有关View的几个基础知识点-IOS开发
    我一般情况下不会使用interfacebuilder去画界面,而是用纯代码去创建界面,不是装B,而是刚从vi转到xcode不久,不太习惯interfacebuilder而已。当然如果需要我也会使用它。一个东......
  • Objective-C 内存管理
        大概是因为Objective-C是C的超集,所以Objective-C也使用alloc来申请内存,不同的是C调用free来直接释放内存,而Objective-C不直接调用dealloc来释放内存。整个Obje......
  • 《安富莱嵌入式周报》第293期:SEGGER开源其C/C++库源码emRun,丰富EMC电磁兼容资,OTA开源
    往期周报汇总地址:http://www.armbbs.cn/forum.php?mod=forumdisplay&fid=12&filter=typeid&typeid=104 视频版:https://www.bilibili.com/video/BV1ND4y1v7ik/ 1、......
  • 性能优化:内存泄漏2
    单例模式导致内存对象无法释放而导致内存泄露MainActivity在内存当中泄露了。这个故事告诉我们能用Application的context就用Application的CommonUtil生命周期跟MainActi......
  • 性能优化:内存泄漏1
    性能优化1主要是经验—车技。1.如何去优化自己现有的项目,运行更加流畅。app进程16M,32M,64M。8M2.以后开发项目的时候就要从一开始就摆好发车车技。--------------------......
  • vite 运行或打包出现内存溢出的解决方案
    在使用vite运行或打包时出现了内存耗尽的报错viteVUEnpmrunbuild报错npmERR!codeELIFECYCLEnpmERR!errno134内存溢出  node内存泄漏耗尽解决方法:在使......