文章目录
一、HTTP状态管理:Cookie与Session
Cookie(服务器需要记录该用户状态,就向客户端浏览器颁发一个Cookie)
Cookie实际上是一小段的文本信息,客户端请求服务器,如果服务器需要记录该用户状态,就向客户端浏览器颁发一个Cookie。
客户端浏览器会把Cookie保存起来,当浏览器再请求该网站的时候,浏览器把请求的网址连同该Cookie一同提交给服务器,服务器检查该Cookie,以此来辨认用户状态。
Session
Session上另外一种记录客户状态的机制,保存在服务器上,客户端浏览器访问服务器的时候,服务器把客户端信息以某种形式记录在服务器上。
如果客户端访问的时候没带SessionID,则会创建SessionID,SessionID存放在Cookie中。
保存SessionID的方式
- Cookie
- URL重写
Session的有效期
- Session超时失效
- 程序调用HttpSession.invalidate()
- 服务器进程被停止
Cookie和Session的比较
- 存放位置不同
- 安全性不同(Cookie存在浏览器中,可能会设置修改,泄漏信息)
- 有效期上的不同
- 对服务器压力的不同
二、HTTP协议结构和通讯原理
字符集与编码
计算机系统是二进制系统,本身是以2进制的形式保存和处理数据的。也就是说不管是使用键盘进行输入还是用计算机读取文本文件,得到的原始内容都是2进制的。需要对2进制进行显示的时候,计算机会依照某种机制取到二进制所表示的数据,就可以得到实际数据。
-
字库表存储了编码规范所能显示的所有字符。
-
在一个字库表中,每一个字符都有一个对应的二进制地址,而字符集就是这些地址的集合。在ASCII编码的字符集里面a的地址就是65即010001。
-
知道了字库表和字符集以后,就可以使用二进制得到字符,但是直接使用字符对应的二进制地址显然十分麻烦因为很长。于是程序猿就制定了一些算法来节省空间而每种不同的算法都被称作一种编码方式,一套编码规范可以有不同的编码方式,不同的编码方式有不同的适应场景,比如UTF-8是一种编 码方式,它对应的编码规范叫做Unicode,除了utf-8还有utf-16以及utf-32两种方式。
编码规范
编码规范规定了对哪些东西进行编码?
ASCII:最早产生的编码规范,一直包含从00000000-01111111,可以表示阿拉伯数字和英文大小写以及一些简单的符号。8个2进制位占据一个字节的存储空间。
GBK:中日韩汉字等,每个字符占两个字节,不管中文还是英文
Unicode包含了全世界所有的字符,最多可以保存四个字节的字符,但是每个字符都要四个字节很浪费空间,于是程序猿就设计出了UTF-8、UTF-16、UTF-32。
乱码就是使用的编码方式和解码方式不一致导致的,或者编码的时候在字库表中不包含响应的字符。
URL的编码和解码
URL是采用ASCII字符集进行编码的,所以如果URL中含有非ASCII字符集中的字符,要对其进行编码。
URL中一些保留字,如&表示参数分割符,如果想要在URL中使用这些保留字,那就需要编码。
在URL中属于ASCII的非保留字,无需编码,对ASCII中的保留字,取其ASCII内码,加上“%”前缀将该字符进行编码,对其URL中非ASCII的字符,需要取其在Unicode内码,然后加上“%”前缀将该字符进行编码。
三、HTTP协议之身份认证
身份认证信息
- 密码
- 动态令牌
- 数字证书
- 生物认证
- IC卡等
常见认证方式
- BASIC认证(基本认证)
- IDGEST(摘要认证)
- SSL客户端认证
- FormBase认证(基于表单认证)
BASIC认证
不够安全,因为base64被解码就会得到原来的数据。
DIGEST认证
质询/响应方式指的是一方会先发送认证要求给另外一方,接着使用在另一方收到的质询码
SSL客户端认证(成本高)
基于表单的认证
四、HTTP的长连接与短连接
- HTTP协议是基于请求/响应模式的,因此只要服务器响应,本次HTTP请求就结束了。
- HTTP的长连接和短连接本质上是TCP的长连接和短连接
- HTTP/1.0,默认使用的是短连接,也就是说,浏览器和服务器每进行一次HTTP操作,就建立一次连接,结束就中断。
- HTTP/1.1起,默认使用长连接,用以保持连接特性。
五、HTTP缓存
为什么要使用HTTP缓存?
缓存的内容又是什么?
缓存工作方式
last-Modified只能精确到秒,如果文件在一秒钟以内发生变化怎么办?
六、内容协商机制
向英语用户发送英文版,向法语用户发送法文版等。
七、断点续传和多线程下载
HTTP是通过在Header里面有两个参数实现的,客户端发请求时对应的Range,服务器端响应时对应的是Content-Range。
Range
- Range
- 用于请求头中,指定第一个字节的位置和最后一个字节的位置,一般格式:
Range:(unit=first byte pos)-[last byte pos]
左开右闭
Content-Range
用于响应头中,在发出带Range的请求后,服务器会在Content-Range头部返回当前接受的范围和文件总大小,一般格式:
Content-Range:byte(unit first byte pos) - [last byte pos]/[entity length]