一、HTTP协议简介
Web的应用层协议是超文本传输协议(HTTP),它是Web的核心。HTTP需要由客户端程序和服务端程序共同实现。
在现实场景中,可以设想我们通过浏览器浏览某个网站的场景,在这个过程中Web浏览器就是客户端,其实现了HTTP客户端;而Web服务器就是服务端,用于存储Web对象,其实现了HTTP的服务端。
HTTP协议定义了Web服务器请求Web页面的方式,以及服务器向客户端传输Web页面的方式,其交互过程中通过请求和相应的方式来进行。服务器通过HTTP报文请求向服务端请求页面中所包含的对象,服务端在接收到HTTP报文之后通过响应报文对客户端请求的对象进行响应。
二、持续连接和非持续连接
HTTP1.1做出的一个重要的改进就是支持持续连接(也称长链接),相较于HTTP1.0的非持续连接(短连接),持续连接优点在于,对于多个请求响应可采用同一个连接,无需对多个请求创建不同的的连接。
举个例子,比如网站上有很多图片,如果使用非持续连接,那么每次我们打开一个图片,就需要创建一个连接,这样做获取图片的效率是非常低的,因为在建立连接之前需要有三次握手的过程。而持续连接下,则可以在之前建立好的连接上继续进行请求和相应,获取图片的效率大大提高。
三、HTTP报文的格式
既然请求和相应之间通过HTTP报文来进行交互,那么对HTTP报文的格式来做一下简单的介绍
1)HTTP请求报文:
GET /somedir/page.html HTTP/1.1
Host: www.someschool.edu
Connection: close
User-agent: Mozilla/5.0
Accept-language: fr
(data)
一个简单的HTTP请求报文的格式如上图所示。
报文的第一行为请求行,其包含3个字段:方法字段,URL字段,HTTP版本字段
方法字段除GET外,还有POST,PUT,DELETE等,URL字段即为请求对象对应的url路径,HTTP版本字段即为当前HTTP版本
接下来的部分为首部行:
Host字段为对象所在的主机的IP地址 Connection为close表示关闭持续连接,User-agent指明了用户代理,即向服务器发送请求的浏览器类型,Accept-language是支持的语言版本
接下来是一行空行
再接下来是实体体,这部分主要用来存储用户提交上来的数据。这里因为是GET请求,请求的相关数据已经写在了url路径中,所以实体体里并没有相关数据。如果是POST请求,那么POST请求提交上来的数据将存在实体体中。
2)HTTP响应报文
HTTP/1.1 200 OK
Connection:close
Date: Tue, 18 Aug 2015 15:44:04 GMT
Server: Apache/2.2.3
Last-Modified: Tue, 18 Aug 2015 15:11:03 GMT
Content-Length: 6821
Content-Type: text/html
(data....)
响应报文的第一行是状态行包括HTTP版本 响应码 相应状态信息
关于HTTP响应码及对应的含义可以参考下面这幅图
接下来是首部行字段
Connection指明了关闭持续连接,Date为服务器产生并发送响应报文的日期和时间,Server指示发送报文的服务器的类型,Last-Modified为对象创建或最后修改的日期和时间,Content-Length为被发送对象的字节数,Content-Type为实体体中对象的类型。
接下来是空行
接下来是实体体字段,此字段中包含服务器响应用户请求的数据
四、cookie和Session
4.1 cookie
Cookie(复数形态:Cookies),是指某些网站为了辨别用户身份、进行session跟踪而储存在用
户本地终端上的数据(通常经过加密)。Cookie是由服务端生成的,发送给客户端(通常是浏览器)的。Cookie总是保存在客户端中,按在客户端中的存储位置,可分为内存Cookie和硬盘Cookie:
1)内存Cookie由浏览器维护,保存在内存中,浏览器关闭后就消失了,其存在时间是短暂的。
2)硬盘Cookie保存在硬盘里,有一个过期时间,除非用户手工清理或到了过期时间,硬盘Cookie不会被删除,其存在时间是长期的。所以,按存在时间,可分为非持久Cookie和持久Cookie。
设置cookie的过程:
1.该用户生成一个唯一的识别码,创建cookie对象
2.通过maxAge设置该cookie的最大时效
3.将cookie放到http响应报头中
4.发送报文
Cookie: PREF=ID=80a06da87be9ae3c:U=f7167333e2c3b714:NW=1:TM=1261551909:LM=1261551917:S=y
此后报文中会携带cookie字段。
之后客户端会从报文中获取用户的cookie并从里面找到相应的数据
Cookie的根本作用就是在客户端存储用户访问网站的一些信息。典型的应用有:
1、记住密码,下次自动登录。
2、购物车功能。
3、记录用户浏览数据,进行商品(广告)推荐。
Cookie缺点:
1.Cookie会被附加在每个HTTP请求中,所以无形中增加了流量。
2.由于在HTTP请求中的Cookie是明文传递的,所以安全性成问题。(除非用HTTPS)
3.Cookie的大小限制在4KB左右。对于复杂的存储需求来说是不够用的。
4.2 Session
Session代表服务器与浏览器的一次会话过程,这个过程是连续的,也可以时断时续的。
Session是一种服务器端的机制,Session 对象用来存储特定用户会话所需的信息当用户访问到一个服务器,如果服务器启用Session,服务器就要为该用户创建一个SESSION,在创建这个SESSION的时候,服务器首先检查这个用户发来的请求里是否包含了一个SESSION ID,如果包含了一个SESSION ID则说明之前该用户已经登陆过并为此用户创建过SESSION,那服务器就按照这个SESSION ID把这个SESSION在服务器的内存中查找出来(如果查找不到,就有可能为他新创建一个),如果客户端请求里不包含有SESSION ID,则为该客户端创建一个SESSION并生成一个与此SESSION相关的SESSION ID。这个SESSION ID是唯一的、不重复的、不容易找到规律的字符串,这个SESSION ID将被在本次响应中返回到客户端保存,而保存这个SESSION ID的正是COOKIE,这样在交互过程中浏览器可以自动的按照规则把这个标识发送给服务器。
Session的根本作用就是在服务端存储用户和服务器会话的一些信息。
典型的应用有:
1、判断用户是否登录。
2、购物车功能。
4.3 Cookie 和 Session的区别
1)存放位置不同:cookie存放于客户端,Session存放于服务端。
2)可存储的数据类型不同:cookie只能存ACSII型 不能存复杂类型,session支持复杂类型的数据的存储。
3)安全性:cookie存储在浏览器中,对客户端的某些程序是可见的,因此cookie中的内容可能会被窃取和修改Session对客户端是透明的,安全性较高。
4)有效时间:cookie的有效时间可以人为设置,session在浏览器关闭就会失效。
5)对服务器的压力:session保存在服务端,如果有大量的session,对服务器的压力较大,cookie保存在客户端,不占用服务器的资源,对服务器的压力较小。
6)跨域支持:cookie支持跨域访问 session不支持跨域访问。
五、Web缓存
Web缓存器也叫代理服务器,它能够代表初始Web服务器来满足HTTP请求的网络实体。一旦配置了缓存,则对某对象的请求将先被定为到该Web缓存器,若Web缓存器中有相应的对象,则直接返回,无需与服务器建立连接;若没有,再与服务器建立连接进行请求和相应,此时,服务器在响应客户端请求的同时,会将相应的数据存入缓存中。
Web缓存的应用大大提高了Web资源请求的效率。但也引入了一个新的问题,放在缓存中的对象很可能是过期的,即在对象放入缓存之后,服务器更新了对象,但缓存中的对象并不会被服务器更新。这样我们获取到的资源就可能是过期的。
为解决这一问题,HTTP协议引入条件GET方法
即在请求报文的首部行中加入一个If-Modified-Since字段:
If-Modified-Since: Wed, 9 Sep 2015 09:23:24
如图所示,在加入该字段后,这个GET请求将变为条件GET请求,其告诉服务器,只有在9.9 09:23:24之后对象修改过时,才会发送这个对象过来。
在上面的响应报文中我们可以看到Last-Modified字段,当对象存储在缓存中时,这个Last-Modified所对应的修改时间也会被存储到缓存中,一旦发现缓存过期,那么就会重新向Web服务器请求这个对象。