Tomcat(01)—— 基础
1. 什么是web容器
早期的 Web 应用主要用于浏览新闻等静态页面,HTTP 服务器(比如 Apache、Nginx)向浏览器返回静态 HTML,浏览器负责解析 HTML,将结果呈现给用户。随着互联网的发展,我们已经不满足于仅仅浏览静态页面,还希望通过一些交互操作,来获取动态结果,因此也就需要一些扩展机制能够让 HTTP 服务器调用服务端程序。
于是 Sun 公司推出了 Servlet 技术。你可以把 Servlet 简单理解为运行在服务端的 Java 小程序,但是 Servlet 没有 main 方法,不能独立运行,因此必须把它部署到 Servlet 容器中,由容器来实例化并调用 Servlet。
而 Tomcat 和 Jetty 就是一个 Servlet 容器。为了方便使用,它们也具有 HTTP 服务器的功能,因此Tomcat 或者 Jetty 就是一个“HTTP 服务器 + Servlet 容器”,我们也叫它们 Web 容器。
其他应用服务器比如 JBoss 和 WebLogic,它们不仅仅有 Servlet 容器的功能,也包含 EJB 容器,是完整的 Java EE 应用服务器。从这个角度看,Tomcat 和 Jetty 算是一个轻量级的应用服务器。
在微服务架构下,我们把一个大而全的单体应用,拆分成一个个功能单一的微服务,在这个过程中,服务的数量必然要增加,但为了减少资源的消耗,并且降低部署的成本,我们希望运行服务的 Web 容器也是轻量级的,Web 容器本身应该消耗较少的内存和 CPU 资源,并且由应用本身来启动一个嵌入式的 Web 容器,而不是通过 Web 容器来部署和启动应用,这样可以降低应用部署的复杂度。
2. Tomcat在一次请求中做了什么
从图上你可以看到,这个过程是:
-
用户通过浏览器进行了一个操作,比如输入网址并回车,或者是点击链接,接着浏览器获取了这个事件。
-
浏览器向服务端发出 TCP 连接请求。
-
服务程序接受浏览器的连接请求,并经过 TCP 三次握手建立连接。
-
浏览器将请求数据打包成一个 HTTP 协议格式的数据包。
-
浏览器将该数据包推入网络,数据包经过网络传输,最终达到端服务程序。
-
服务端程序拿到这个数据包后,同样以 HTTP 协议格式解包,获取到客户端的意图。
-
得知客户端意图后进行处理,比如提供静态文件或者调用服务端程序获得动态结果。
-
服务器将响应结果(可能是 HTML 或者图片等)按照 HTTP 协议格式打包。
-
服务器将响应数据包推入网络,数据包经过网络传输最终达到到浏览器。
-
浏览器拿到数据包后,以 HTTP 协议的格式解包,然后解析数据,假设这里的数据是 HTML。
-
浏览器将 HTML 文件展示在页面上。
tomcat主要是接受连接、解析请求数据、处理请求和发送响应这几个步骤。
3. HTTP 请求响应实例
HTTP 请求数据由三部分组成,分别是请求行、请求报头、请求正文。
当这个 HTTP 请求数据到达 Tomcat 后,Tomcat 会把 HTTP 请求数据字节流解析成一个 Request 对象,这个 Request 对象封装了 HTTP 所有的请求信息。接着 Tomcat 把这个 Request 对象交给 Web 应用去处理,处理完后得到一个 Response 对象,Tomcat 会把这个 Response 对象转成 HTTP 格式的响应数据并发送给浏览器。
HTTP 的响应也是由三部分组成,分别是状态行、响应报头、报文主体。
4. tomcat与Session 创建存储
HTTP 协议有个特点是无状态,请求与请求之间是没有关系的。但通过Cookie 和 Session我们就可以让请求与请求之间建立起联系。
无状态是指协议对于事务处理没有记忆功能,对同一个url请求没有上下文关系,每次的请求都是独立的,服务器中没有保存客户端的状态。HTTP协议长连接、短连接实质上是TCP协议的长连接、短连接。长连接省去了较多的TCP建立、关闭操作,减少了浪费,节约时间;短连接对于服务器来说管理较为简单,存在的连接都是有用的连接,不需要额外的控制手段。
Cookie 和 Session
Cookie 本质上就是一份存储在用户本地的文件,里面包含了每次请求中都需要传递的信息。由于 Cookie 以明文的方式存储在本地,而 Cookie 中往往带有用户信息,这样就造成了非常大的安全隐患。而Session存储在服务端。
具体工作过程是这样的:服务器在创建 Session 的同时,会为该 Session 生成唯一的 Session ID,当浏览器再次发送请求的时候,会将这个 Session ID 带上,服务器接受到请求之后就会依据 Session ID 找到相应的 Session,找到 Session 后,就可以在 Session 中获取或者添加内容了。而这些内容只会保存在服务器中,发到客户端的只有 Session ID。
session创建
在 Java 中,是 Web 应用程序在调用 HttpServletRequest 的 getSession 方法时,由 Web 容器(比如 Tomcat)创建的。