Web容器和HTTP协议必知必会

Web容器是什么

在早期,Web容器是指HTTP服务器。因为在那时候浏览器只是用来浏览新闻和文章的,像类似的Apache,Nginx等HTTP服务器就是负责向浏览器返回静态资源如HTML等,然后浏览器在负责解析HTML来展现给用户。

后来,人们又要求网页呈现动态化和交互效果,于是伟大的Web开发工程师就想出了一种扩展机制来让HTTP服务器调用服务端程序,Sun公司由此推出了Servlet技术,我们可以简单理解它是运行在服务端的Java小程序,但是Servlet没有main方法,他不能独立运行,必须把它部署到Servlet容器中,由容器来实例化并调用Servlet。

而Tomcat和Jetty就是一个Servlet容器,同时它具有HTTP服务器的功能,因此Tomcat或Jetty就是一个HTTP服务器+Servlet容器,我们也叫它 Web容器

而类似的,JBoss,WebLogic,他们不仅仅有Servlet容器的功能,同时也包含EJB容器,是完整的JavaEE应用服务器。

而对于倾向于轻量化的今天,尤其是微服务大行其道的今天,Tomcat和Jetty的轻量化更加吸引了人们的使用,在SpringBoot中Tomcat就作为嵌入应用的默认Web容器。

HTTP协议

学过网络的都知道OSI七层模型,而HTTP是在应用层的协议,HTTP是基于传输层TCP/IP协议来传输数据(HTML,图片,查询结果等)的。HTTP不涉及数据包的传输,主要规定了传输数据的格式即客户端和服务端的通信格式

假设这时候一个浏览器要从远程HTTP服务器获取HTML文本,这个过程中,实际要做两件事情。

  1. 与服务器建立socket连接

  2. 生成请求数据并通过socket发送出去

    其中这个请求数据就必须遵循某种特定的数据格式,这种数据格式其实就是HTTP协议的本质。

HTTP请求格式

请求行,请求报头,请求正文

请求格式

HTTP相应格式

状态行,响应报头,报文主体

相应格式

存储在用户本地的文件,里面包含了每次请求需要传递的消息,每次HTTP请求报文中都包含有Cookie。

Session

因为Cookie的明文传输的问题,Session出现了。Session可以理解为服务器开辟的存储空间,里面保存了用户的状态信息。

那么Session在何时何地创建呢?当然还是在服务器端程序运行的过程中创建的,不同语言实现的应用程序有不同的创建Session的方法。在Java中,是Web应用程序在调用HttpServletRequest的getSession方法时,由Web容器(比如Tomcat)创建的。

同时,Session有过期时间,因此Tomcat会开启后台线程定期的轮询,如果Session过期了就将Session失效。

Session怎么和请求对应起来的呢?

Cookie, 浏览器在Cookie中填充了一个SessionID字段用来表示请求

工作流程:

创建Session同时生成唯一ID,当浏览器再次发送请求的时候会将SessionID带上,服务器通过SessionID来寻找对应的Session,然后对其进行操作,具体内容只会保存在服务器中,客户端只会存SessionID,这样来说相对安全,但不是绝对安全。但是当访问量变多时候服务器不可能能承受那么多Session,这时候服务器要做集群,但是集群中还要解决Session共享的问题,所以一般会引入中间件Redis来存储Session。

-------------本文结束感谢阅读-------------