【协议】HTTP协议

HTTP协议

网络基础TCP/IP

为了理解 HTTP,我们有必要事先了解一下 TCP/IP 协议族;

协议,规定了计算机之间通信和交互的规则,TCP/IP 是互联网相关的各类协议族的总称;

TCP/IP 的分层管理

TCP/IP 协议族里重要的一点就是分层;

TCP/IP 协议族按层次分别分为以下 4 层:应用层、传输层、网络层和数据链路层;

分层好处:

各层之间相互独立,每一层的功能非常明确,且易于实现和维护

(当某一层需要做改动时,只要保证各层间的接口关系不变,层次内部的设计就可以自由改动)

各层功能:

1)应用层:

规定了上层应用进程之间通信和交互的规则;

2)传输层:

为进程间的通信提供通用的数据传输服务;

在传输层有2个性质不同的协议:TCP(传输控制协议)和UDP(用户数据报协议)

TCP和UDP区别:

1、UDP是无连接的,即发送数据之前不需要建立连接(当然,发送数据结束后也没有连接可释放),因此减小了开销和发送数据前的时延;TCP是面向连接的,发送数据前需要经过3次握手建立连接,数据发送结束后需要经过4次握手释放连接;

2、UDP是尽最大努力的交付,即不保证可靠交付;而TCP通过建立连接,报文确认,超时重传等机制提供可靠传输,通过TCP传输的数据无丢包,乱序和重复;

3、UDP是面向报文的,就是说UDP对于应用程序交下来的报文,添加首部后就直接交给IP层,因此应用程序需要选择合适的报文大小,若报文太长,需要进行IP分片,降低IP层的效率;若报文太短,首部开销相对较大,同样会降低IP层的效率;而TCP是面向字节流,会根据对方给出的滑动窗口大小以及网络拥塞情况决定发送报文的大小;

4、UDP没有拥塞控制,因此网络的拥塞并不会使源主机的发送速率降低,对于某些实时应用是非常重要的;而TCP提供了相应的流量控制和拥塞控制机制;

5、UDP适用一对一,一对多,多对一,多对多的交互通信;而TCP由于需要建立连接,只适用点对点的通信;

6、UDP的首部开销小,只有8字节,比TCP的20字节要短;

TCP适用于可靠性要求较高的传输,但效率较低;

UDP适用于实时性、效率要求较高的传输,在保证实时性的前提下,上层应用可以适当增加一些提高可靠性的措施,比如重传丢失的报文等。

3)网络层

负责路由选择和网络传输,为不同网络上的主机提供逻辑通信;

4)数据链路层

负责同一局域网内的结点间传输,IP数据报的封装和解封装;

5)物理层

负责传输0 1 0 1的比特流

与HTTP密切相关的协议

DNS 负责域名解析

TCP 负责可靠传输

IP 负责网络传输

首先通过DNS协议解析请求的服务器IP地址,然后与服务器之间建立TCP连接;

这中间客户端与服务器之间需通过IP协议、ARP协议进行报文中转直到传输至目的IP;

连接建立成功后,上层应用基于TCP连接进行HTTP协议报文之间的交互。

HTTP基础概念

1 简介

HTTP协议是Hyper Text Transfer Protocol(超文本传输协议)的缩写;

RFC 1945定义了HTTP/1.0版本,最著名的就是RFC 2616,RFC 2616定义了今天普遍使用的一个版本——HTTP 1.1

HTTP协议是一个应用层协议,由请求和响应构成,是一个标准的客户端/服务器模型。

2 在TCP/IP协议栈中的位置

HTTP协议通常承载于TCP协议之上,有时也承载于TLS或SSL协议层之上,这时候就成了我们常说的HTTPS;

默认HTTP的端口号为80,HTTPS的端口号为443;

3 HTTP的请求响应模型

HTTP协议永远都是客户端发起请求,服务器回送响应;

这样就限制了使用HTTP协议,无法实现在客户端没有发起请求的时候,服务器将消息推送给客户端;

4 无状态协议

HTTP协议是一种无状态协议,HTTP协议本身不具备保存之前发送过的请求和响应的功能。

但对于一些需要保存用户状态的场景,比如用户登录网站状态就不适用了。

为了实现保持状态的功能,引入了Cookie技术。

Cookie 技术通过在请求和响应报文中写入 Cookie 信息来控制客户端的状态。

Cookie 会根据从服务器端发送的响应报文内的一个叫做 Set-Cookie 的首部字段信息,通知客户端保存Cookie ;

当下次客户端再往该服务器发送请求时,客户端会自动在请求报文中加入 Cookie 值后发送出去。

服务器端发现客户端发送过来的 Cookie 后,会去检查究竟是从哪一个客户端发来的连接请求,然后对比服务器上的记录,最后得到之前的状态信息。

5 告知服务器意图的HTTP方法

下面,我们介绍 HTTP/1.1 中可使用的方法:

GET 获取资源

GET 方法用来请求访问已被 URI 识别的资源。指定的资源经服务器端解析后返回响应内容。

POST 传输实体主体

POST 方法用来传输实体的主体。

虽然用 GET 方法也可以传输实体的主体,但一般不用 GET 方法进行传输,而是用 POST 方法。

虽说 POST 的功能与 GET 很相似,但 POST 的主要目的并不是获取响应的主体内容。

PUT 传输文件

PUT 方法用来传输文件。

就像 FTP 协议的文件上传一样,要求在请求报文的主体中包含文件内容,然后保存到请求 URI 指定的位置。

HEAD 获得报文首部

HEAD 方法和 GET 方法一样,只是不返回报文主体部分。用于确认 URI 的有效性及资源更新的日期时间等。

DELETE 删除文件

DELETE 方法用来删除文件,是与 PUT 相反的方法。DELETE 方法按请求 URI 删除指定的资源。

OPTIONS 询问支持的方法

OPTIONS 方法用来查询针对请求 URI 指定的资源支持的方法。

TRACE 追踪路径

TRACE 方法是让 Web 服务器端将之前的请求通信环回给客户端的方法。

TRACE 方法本来就不怎么常用,再加上它容易引发 XST(Cross-Site Tracing,跨站追踪)攻击,通常就更不会用到了。

CONNECT 要求用隧道协议连接代理

6 持久连接节省通信量

HTTP 协议的初始版本中,每进行一次 HTTP 通信就要断开一次 TCP 连接。

HTTP/1.1使用持久连接,持久连接的特点是,只要任意一端没有明确提出断开连接,则保持 TCP 连接状态。

持久连接的好处在于减少了 TCP 连接的重复建立和断开所造成的额外开销,提高了传输效率。

7 编码提升传输速率

HTTP 在传输数据时可以按照数据原貌直接传输,但也可以在传输过程中通过编码提升传输速率。

内容编码指明应用在实体内容上的编码格式,并保持实体信息原样压缩。

内容编码后的实体由客户端接收并负责解码。

8 获取部分内容的范围请求

指定范围发送的请求叫做范围请求(Range Request)。

执行范围请求时,会用到首部字段 Range 来指定资源的 byte 范围。

针对范围请求,响应会返回状态码为 206 Partial Content 的响应报文。

另外,对于多重范围的范围请求,响应会在首部字段 Content-Type 标明 multipart/byteranges 后返回响应报文。

如果服务器端无法响应范围请求,则会返回状态码 200 OK 和完整的实体内容。

9 返回结果的 HTTP 状态码

200 OK 

表示从客户端发来的请求在服务器端被正常处理了

204 No Content 

代表服务器接收的请求已成功处理,但在返回的响应报文中不含实体的主体部分

206 Partial Content 

表示客户端进行了范围请求,而服务器成功执行了这部分的 GET 请求;响应报文中包含由Content-Range 指定范围的实体内容。

301 Moved Permanently

永久性重定向

302 Found

临时性重定向

303 See Other

由于请求对应的资源存在着另一个 URI,应使用 GET 方法定向获取请求的资源

304 Not Modified

304 状态码返回时,不包含任何响应的主体部分。304 虽然被划分在 3XX 类别中,但是和重定向没有关系

400 Bad Request

表示请求报文中存在语法错误

401 Unauthorized

表示发送的请求需要有通过 HTTP 认证

403 Forbidden

表明对请求资源的访问被服务器拒绝了

404 Not Found

表明服务器上无法找到请求的资源

5XX 服务器错误

协议详解

1 HTTP/1.0和HTTP/1.1的区别

 1)连接建立方面

HTTP/1.0 每次请求都需要建立新的TCP连接,连接不能复用。

HTTP/1.1 新的请求可以在上次请求建立的TCP连接之上发送,连接可以复用。

优点是减少重复进行TCP三次握手的开销,提高效率。

注意:在同一个TCP连接中,新的请求需要等上次请求收到响应后,才能发送;

2)Host头域

HTTP1.1在Request消息头里头多了一个Host域, HTTP1.0则没有这个域;

3)日期时间戳

无论是HTTP1.0还是HTTP1.1,都要能解析下面三种date/time stamp:

Sun, 06 Nov 1994 08:49:37 GMT ;        RFC 822, updated by RFC 1123
Sunday, 06-Nov-94 08:49:37 GMT ;      RFC 850, obsoleted by RFC 1036
Sun Nov 6 08:49:37 1994 ;                    ANSI C's asctime() format

HTTP1.0要求不能生成第三种asctime格式的date/time stamp;

HTTP1.1则要求只生成RFC 1123(第一种)格式的date/time stamp;

4)状态响应码

状态响应码100 (Continue) 状态代码的使用,允许客户端在发request消息body之前先用request header试探一下server;

看server要不要接收request body,再决定要不要发request body;

客户端在Request头部中包含Expect: 100-continue,Server看到之后呢如果回100 (Continue) 这个状态代码,客户端就继续发request body。这个是HTTP1.1才有的;

另外在HTTP/1.1中还增加了101、203、205等等性状态响应码;

5)请求方式

HTTP1.1增加了OPTIONS,PUT,DELETE,TRACE,CONNECT这些Request方法。

2 HTTP报文

用于 HTTP 协议交互的信息被称为 HTTP 报文。

请求端(客户端)的 HTTP 报文叫做请求报文,

响应端(服务器端)的叫做响应报文。

HTTP 报文本身是由多行(用 CR+LF 作换行符)数据构成的字符串文本。

请求报文

发出的请求信息格式如下:

请求行:例如GET /images/logo.gif HTTP/1.1,表示从/images目录下请求logo.gif这个文件

请求头:例如Accept-Language: en;在HTTP/1.1协议中,所有的请求头,除host外,都是可选的。

请求行和请求头必须以<CR><LF>(即\ r\ n)作为结尾(也就是,回车换行)

空行:空行内必须只有<CR><LF>(即\ r\ n)而无其他空格

可选的消息体

响应报文

HTTP头部

通用首部字段

1)Cache-Control 通过指定首部字段 Cache-Control 的指令,就能操作缓存的工作机制。

no-cache 指令:

防止从缓存中返回过期的资源,表示客户端将不会接收缓存过的响应。

于是,“中间”的缓存服务器必须把客户端请求转发给源服务器。

only-if-cached 指令:

表示客户端仅在缓存服务器本地缓存目标资源的情况下才会要求其返回。

public 指令:

当指定使用 public 指令时,则明确表明其他用户也可利用缓存。

private 指令:

当指定 private 指令后,响应只以特定的用户作为对象,这与 public 指令的行为相反。

缓存服务器会对该特定用户提供资源缓存的服务,对于其他用户发送过来的请求,代理服务器则不会返回缓存。

2)Connection存在2个功能:

一、控制不再转发给代理的首部字段;

二、管理持久连接(close或Keep-Alive)

3)Date 表明创建 HTTP 报文的日期和时间

4)Transfer-Encoding 规定了传输报文主体时采用的编码方式

请求首部字段

1)Accept

Accept 首部字段可通知服务器,用户代理能够处理的媒体类型及媒体类型的相对优先级。

如:Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8

2)Accept-Charset,Accept-Encoding,Accept-Language

用来通知服务器用户代理支持的字符集及字符集(内容编码,自然语言集)的相对优先顺序

3)Authorization

首部字段 Authorization 是用来告知服务器,用户代理的认证信息(证书值)。

通常,想要通过服务器认证的用户代理会在接收到返回的 401 状态码响应后,把首部字段 Authorization 加入请求中。

4)Host

首部字段 Host 会告知服务器,请求的资源所处的互联网主机名和端口号。

Host 首部字段在 HTTP/1.1 规范内是唯一一个必须被包含在请求内的首部字段。

首部字段 Host 和以单台服务器分配多个域名的虚拟主机的工作机制有很密切的关联,这是首部字段 Host 必须存在的意义。

一台 HTTP 服务器可以实现多个域名,在互联网上,域名通过 DNS 服务映射到 IP 地址(域名解析)之后访问目标网站。

可见,当请求发送到服务器时,已经是以 IP 地址形式访问了。

在相同的 IP 地址下,由于虚拟主机可以寄存多个不同主机名和域名的 Web 网站,

因此在发送 HTTP 请求时,必须在 Host 首部内完整指定主机名或域名的 URI。

5)if-xxx

形如 If-xxx 这种样式的请求首部字段,都可称为条件请求。

服务器接收到附带条件的请求后,只有判断指定条件为真时,才会执行请求。

If-Match:只有当 If-Match 的字段值跟 ETag 值匹配一致时,服务器才会接受请求

If-None-Match:只有在 If-None-Match 的字段值与 ETag 值不一致时,可处理该请求。

If-Modified-Since:如果在 If-Modified-Since 字段指定的日期时间后,资源发生了更新,服务器会接受请求

If-Unmodified-Since:告知服务器,指定的请求资源只有在字段值内指定的日期时间之后,未发生更新的情况下,才能处理请求

If-Range:告知服务器若指定的 If-Range 字段值(ETag 值或者时间)和请求资源的 ETag 值或时间相一致时,则作为范围请求处理。反之,则返回全体资源。

6)Range

对于只需获取部分资源的范围请求,包含首部字段 Range 即可告知服务器资源的指定范围;

接收到附带 Range 首部字段请求的服务器,会在处理请求之后返回状态码为 206 Partial Content 的响应。

无法处理该范围请求时,则会返回状态码 200 OK 的响应及全部资源。

7)Referer

首部字段 Referer 会告知服务器请求的原始资源的 URI。

8)User-Agent

首部字段 User-Agent 会将创建请求的浏览器和用户代理名称等信息传达给服务器。

响应首部字段

1)Accept-Ranges

用来告知客户端服务器是否能处理范围请求,以指定获取服务器端某个部分的资源。

可指定的字段值有两种,可处理范围请求时指定其为 bytes,反之则指定其为 none。

2)ETag

首部字段 ETag 能告知客户端实体标识。它是一种可将资源以字符串形式做唯一性标识的方式。

服务器会为每份资源分配对应的 ETag值。

3)Location

使用首部字段 Location 可以将响应接收方引导至某个与请求 URI 位置不同的资源。

4)Server

首部字段 Server 告知客户端当前服务器上安装的 HTTP 服务器应用程序的信息。

5)WWW-Authenticate

首部字段 WWW-Authenticate 用于 HTTP 访问认证。

它会告知客户端适用于访问请求 URI 所指定资源的认证方案(Basic 或是 Digest)和带参数提示的质询(challenge)

状态码 401 Unauthorized 响应中,肯定带有首部字段 WWW-Authenticate。

实体首部字段

实体首部字段是包含在请求报文和响应报文中的实体部分所使用的首部,用于补充内容的更新时间等与实体相关的信息。

1)Allow

首部字段 Allow 用于通知客户端能够支持 Request-URI 指定资源的所有 HTTP 方法。

2)Content-Encoding,Content-Language,Content-Length,

Content-Location,Content-MD5,Content-Range,Content-Type

告知客户端服务器对实体的主体部分选用的内容编码方式,自然语言,大小(单位是字节),MD5,范围,媒体类型

3)Expires

首部字段 Expires 会将资源失效的日期告知客户端;

缓存服务器在接收到含有首部字段 Expires 的响应后,会以缓存来应答请求,

在 Expires 字段值指定的时间之前,响应的副本会一直被保存。

当超过指定的时间后,缓存服务器在请求发送过来时,会转向源服务器请求资源。

4)Last-Modified

首部字段 Last-Modified 指明资源最终修改的时间。

为Cookie服务的首部字段

1)Set-Cookie

响应首部字段,开始状态管理所使用的Cookie信息

如:Set-Cookie: status=enable; expires=Tue, 05 Jul 2011 07:26:31 GMT; path=/; domain=.hackr.jp;

当服务器准备开始管理客户端的状态时,会事先告知各种信息。

2)Cookie

请求首部字段,服务器接收到的Cookie

首部字段 Cookie 会告知服务器,当客户端想获得 HTTP 状态管理支持时,就会在请求中包含从服务器接收到的 Cookie。

确保HTTP安全的HTTPS

HTTP 主要有以下这些不足:

1)通信使用明文(不加密),内容可能会被窃听

HTTPS:HTTP 协议中没有加密机制,但可以通过和 SSL(Secure Socket Layer,安全套接层)或 TLS(Transport Layer Security,安全层传输协议)的组合使用,加密 HTTP 的通信内容。
用 SSL 建立安全通信线路之后,就可以在这条线路上进行 HTTP 通信了。与 SSL 组合使用的 HTTP 被称为 HTTPS(HTTP Secure,超文本传输安全协议)或 HTTP over SSL。

SSL 采用一种叫做公开密钥加密(Public-keycryptography)的加密处理方式。

加密和解密同用一个密钥的方式称为共享密钥加密;

公开密钥加密使用一对非对称的密钥。一把叫做私有密钥(private key),另一把叫做公开密钥(publickey)。

顾名思义,私有密钥不能让其他任何人知道,而公开密钥则可以随意发布,任何人都可以获得。

使用公开密钥加密方式,发送密文的一方使用对方的公开密钥进行加密处理,对方收到被加密的信息后,再使用自己的私有密钥进行解密。利用这种方式,不需要发送用来解密的私有密钥,也不必担心密钥被攻击者窃听而盗走。

2)不验证通信方的身份,因此有可能遭遇伪装

HTTPS:虽然使用 HTTP 协议无法确定通信方,但如果使用 SSL 则可以;

SSL 不仅提供加密处理,而且还使用了一种被称为证书的手段,可用于确定通信方。

证书由值得信任的第三方机构颁发,用以证明服务器和客户端是实际存在的。

另外,伪造证书从技术角度来说是异常困难的一件事。

3)无法证明报文的完整性,所以有可能已遭篡改

为了有效防止这些弊端,有必要使用 HTTPS。SSL 提供认证和加密处理及摘要功能。

HTTP+ 加密 + 认证 + 完整性保护 =HTTPS

HTTPS 并非是应用层的一种新协议;

只是 HTTP 通信接口部分用 SSL(Secure Socket Layer)和TLS(Transport Layer Security)协议代替而已。

通常,HTTP 直接和 TCP 通信。当使用 SSL 时,则演变成先和 SSL 通信,再由 SSL 和 TCP 通信了。

  • 在使用HTTPS是需要保证服务端配置正确了对应的安全证书

  • 客户端发送请求到服务端

  • 服务端返回公钥和证书到客户端

  • 客户端接收后会验证证书的安全性,如果通过则会随机生成一个随机数,用公钥对其加密,发送到服务端

  • 服务端接受到这个加密后的随机数后会用私钥对其解密得到真正的随机数,随后用这个随机数当做私钥对需要发送的数据进行对称加密

  • 客户端在接收到加密后的数据使用私钥(即生成的随机值)对数据进行解密并且解析数据呈现结果给客户

  • SSL加密建立

-------------------------------------------------------------------------------------------------------------------------------------------------------------

Get和Post的区别

1、Get重点在于从服务器上获取资源,Post重点在于向服务器发送数据;

2、Get参数通过URL传递,Post放在请求主体中;

3、对于Get提交时,传输数据就会受到URL长度的限制。Post由于不是通过URL传值,理论上数据不受限;

4、Get比Post更不安全,因为参数直接暴露在URL中,所以不能用来传递敏感信息

Cookie和Session

会话(Session)跟踪是Web程序中常用的技术,用来跟踪用户的整个会话。

常用的会话跟踪技术是Cookie与Session。

Cookie

Cookie通过在客户端记录信息确定用户身份,Session通过在服务器端记录信息确定用户身份。

Cookie技术是客户端的解决方案,Cookie就是由服务器发给客户端的特殊信息,而这些信息以文本文件的方式存放在客户端,然后客户端每次向服务器发送请求的时候都会带上这些特殊的信息。

Cookie实际上是一小段的文本信息。客户端请求服务器,如果服务器需要记录该用户状态,就使用response向客户端浏览器颁发一个Cookie。客户端浏览器会把Cookie保存起来。当浏览器再请求该网站时,浏览器把请求的网址连同该Cookie一同提交给服务器。服务器检查该Cookie,以此来辨认用户状态。服务器还可以根据需要修改Cookie的内容。

当用户使用浏览器访问一个支持Cookie的网站的时候,用户会提供包括用户名在内的个人信息并且提交至服务器;接着,服务器在向客户端回传相应的超文本的同时也会发回这些个人信息,当然这些信息并不是存放在HTTP响应体(Response Body)中的,而是存放于HTTP响应头(Response Header);当客户端浏览器接收到来自服务器的响应之后,浏览器会将这些信息存放在一个统一的位置,对于Windows操作系统而言,我们可以从: [系统盘]:\Documents and Settings[用户名]\Cookies目录中找到存储的Cookie;自此,客户端再向服务器发送请求的时候,都会把相应的Cookie再次发回至服务器。而这次,Cookie信息则存放在HTTP请求头(Request Header)了。有了Cookie这样的技术实现,服务器在接收到来自客户端浏览器的请求之后,就能够通过分析存放于请求头的Cookie得到客户端特有的信息,从而动态生成与该客户端相对应的内容。

如果你把Cookies看成为http协议的一个扩展的话,理解起来就容易的多了,其实本质上cookies就是http的一个扩展。有两个http头部是专门负责设置以及发送cookie的,它们分别是Set-Cookie以及Cookie。当服务器返回给客户端一个http响应信息时,其中如果包含Set-Cookie这个头部时,意思就是指示客户端建立一个cookie,并且在后续的http请求中自动发送这个cookie到服务器端,直到这个cookie过期。如果cookie的生存时间是整个会话期间的话,那么浏览器会将cookie保存在内存中,浏览器关闭时就会自动清除这个cookie。另外一种情况就是保存在客户端的硬盘中,浏览器关闭的话,该cookie也不会被清除,下次打开浏览器访问对应网站时,这个cookie就会自动再次发送到服务器端。

Cookie的不可跨域名性

Cookie具有不可跨域名性。根据Cookie规范,浏览器访问Google只会携带Google的Cookie,而不会携带Baidu的Cookie。Google也只能操作Google的Cookie,而不能操作Baidu的Cookie。

Cookie的安全属性

HTTP协议不仅是无状态的,而且是不安全的。使用HTTP协议的数据不经过任何加密就直接在网络上传播,有被截获的可能。使用HTTP协议传输很机密的内容是一种隐患。如果不希望Cookie在HTTP等非安全协议中传输,可以设置Cookie的secure属性为true。浏览器只会在HTTPS和SSL等安全协议中传输此类Cookie。

Session

除了使用Cookie,Web应用程序中还经常使用Session来记录客户端状态。Session是服务器端使用的一种记录客户端状态的机制,使用上比Cookie简单一些,不同的是Cookie保存在客户端浏览器中,而Session保存在服务器上。客户端浏览器访问服务器的时候,服务器把客户端信息以某种形式记录在服务器上,相应的也增加了服务器的存储压力。

Cookie和Session区别

1)Cookie将状态保存在客户端,Session将状态保存在服务器端;

2)Cookies是客户端在本地机器上存储的小段文本并随每一个请求发送至同一个服务器。Cookie最早在RFC2109中实现,后续RFC2965做了增强。网络服务器用HTTP头向客户端发送cookies,在客户终端,浏览器解析这些cookies并将它们保存为一个本地文件,它会自动将同一服务器的任何请求缚上这些cookies。Session并没有在HTTP的协议中定义;

3)Session是针对每一个用户的,变量的值保存在服务器上,用一个sessionID来区分是哪个用户。session变量这个值是通过用户的浏览器在访问的时候返回给服务器,当客户禁用cookie时,这个值也可能设置为由get来返回给服务器;

4)就安全性来说:当你访问一个使用session的站点,同时在自己机子上建立一个cookie,建议在服务器端的SESSION机制更安全些。因为它不会任意读取客户存储的信息。

Cookie和Session的方案虽然分别属于客户端和服务端,但是服务端的session的实现对客户端的cookie有依赖关系的,上面我讲到服务端执行session机制时候会生成session的id值,这个id值会发送给客户端,客户端每次请求都会把这个id值放到http请求的头部发送给服务端,而这个id值在客户端会保存下来,保存的容器就是cookie,因此当我们完全禁掉浏览器的cookie的时候,服务端的session也会不能正常使用

Cookie和Session详解:https://www.cnblogs.com/andy-zhou/p/5360107.html

猜你喜欢

转载自blog.csdn.net/weixin_39723165/article/details/81412231