由于 HTTP 协议是一个无状态协议,Web 应用程序无法区分请求是否来源于同一个浏览器,为了跟踪用户状态(如用户身份、登录状态等),需要 Session 与 Cookie 机制。
静态网页和动态网页
静态网页
存放在 Apache 或 Nginx 等服务器文件系统中的 HTML 文件实体。
- 由 htm、html、shtml、xml 等编写;
- 各静态网页的 URL 固定,且以.htm、.html、.shtml、.xml扩展名为后缀;
- 文字、图片等内容均通过既定的 HTML 代码指定;
- 内容相对稳定,易被搜索引擎检索收录;
- 交互性较差;
- 加载速度快、编写简单、可维护性差、不能接收 URL 中的参数来灵活显示内容。
动态网页
浏览器请求某个页面时,服务器可根据时间、传入的参数、数据库状态等信息,动态地生成 HTML 页面后响应给浏览器。浏览器显示的 HTML 一般并不实际存在于服务器中。
在动态网页中输入用户名和密码后可以得到一个凭证,根据这个凭证才能得到目标页面并保持登录状态。
- 由 asp、jsp、PHP、Perl、Python 等编写;
- 以数据库技术为基础,网站维护性好;
- 可实现比静态网页更丰富的功能,如用户注册与登录、在线查询、用户与订单管理等;
- 信息查询方便,能实现即时查询;
- 保密性与安全性要求高,制作成本高,不易被搜索引擎收录
伪静态
为了更美观地显示 URL,可映射 URL 地址使带参的动态网页 URL 被不带参的类静态 URL 替代显示。
无状态 HTTP
服务器接受请求、处理请求、发起响应的过程完全独立,是 HTTP 的无状态性。无状态 HTTP 指的是 HTTP 协议对事务的处理没有记忆能力,表现为服务器无法知悉客户端的状态。意味着随后的请求若基于先前的信息,则客户端必须重传,但这导致了请求的重复与资源的浪费。
为了解决这个问题,引入了 Session 和 Cookie 技术。对于同样的用户信息,服务端用 Session 保存,客户端用 Cookie 保存。下次访问同样的网页时,客户端将自动在请求中带上 Cookie 的内容。服务端接收到请求后,用 Session 与之比对,判定用户状态并返回对应的页面,实现了会话的维持。
在爬虫中,处理需要先登录才能访问的页面时,我们一般会直接将登录成功后获取的Cookie放在请求头里面直接请求,而不重新模拟登录。
Session
Session 即会话,原指一系列有始有终的动作或消息的集合。用户信息以 Session 的形式保存在服务端,当用户在同一网站不同页面间跳转时,会话过程由 Cookie 配合 Session 得以完整维持而不中断。通过了验证的用户第一次访问时,服务端将自动为用户创建一个 Session 对象,除非过期或弃用(如注销账户),服务端不会终止 Session,该用户后续的请求有 Session 参与。
Session 维持的细节如下:
- 客户端第一次完成验证后,服务端自动为用户创建一个 Session 对象;
- 服务器返回一个响应头中有用于用户标记的Set-Cookie字段的响应;
- 客户端将Set-Cookie字段的内容保存为 Cookie;
- 客户端再次请求相同网站时,会把 Cookie 加入请求头;
- 服务器检查 Cookie 内容的 Session ID 等信息并于 Session 校验:
a. 校验通过则认为用户仍保持登录状态并返回登录后的内容;
b. 校验失败则重定向到登录页面。
Cookie
Cookie,原意为曲奇饼干。Web 中指那些存储在用户本地终端上,用于用户身份鉴定、进行 Session 跟踪的数据——Session ID。下面以 知乎 为例学习 Cookie 的属性结构:
访问知乎并登录后,后打开开发者工具在 Application (应用) 选项卡的 Storage (存储) 中找到 Cookies 项,即可看到 Cookies 列表,每一项均为一个 Cookie。
- Name (名称):Cookie 的名称。创建后不可更改;
- Value (值):Cookie 的值。Unicode 字符需要使用字符编码,二进制数据需要使用 BASE64 编码;Domain (域名):可以访问该 Cookie 的域名。为.zhihu.com时,所有以zhihu.com结尾的域名均可访问该 Cookie;
- Path (路径):Cookie 的使用路径。
- Max-Age (最大有效时间):Cookie 的失效时间(秒)。常与Expires (失效)一起使用,计算出 Cookie 的有效时间。若 Max-Age 为正值,表示 Cookie 将在 Max-Age 秒后失效,Cookie 会被写入磁盘,称为持久 Cookie;若为负值,Cookie 仅存在于内存中,浏览器关闭后即刻失效,且不以任何形式保存该 Cookie,称为会话 Cookie;
- Size (大小):Cookie 的大小;
- HttpOnly (HTTP 字段):Cookie 是否仅能以 HTTP 访问。若为true,则只有在 HTTP Headers 中才会带有此 Cookie,而不能使用document.cookie访问;
- Secure (安全性):Cookie 是否只允许使用加密的 HTTPS、SSL 等安全协议传输。默认为false。若有收获,就点个赞吧