1.4 Session和Cookie

1.静态网页和动态网页

  • 静态网页:
    • 定义:网页的HTML代码完整地保存在服务器上,用户请求时,服务器原封不动地把这个文件发送给浏览器。
    • 核心特征:内容固定。只要源代码文件不改,任何人在任何时间访问,看到的内容完全一致。
    • 技术构成:通常仅由 HTML + CSS + JavaScript 组成(且JS通常只负责前端交互,不改变页面主体数据)。
    • 常见后缀:.htm、.html、.xml 等
    • 生成方式:由开发人员手动编写好,上传至服务器。
    • 优点:访问速度极快(无需计算)、对服务器压力小、成本低。
    • 缺点:维护困难(修改一个版权年份需要改所有页面)、没有交互性,无法根据用户登录状态展示不同内容。
  • 动态网页:
    • 定义:网页的HTML代码不是预先写好的,而是在用户请求时,由服务器上的程序实时生成,然后再发送给浏览器。
    • 核心特征:内容可变。根据URL参数、用户登录信息、数据库数据或当前时间,动态拼凑出不同的页面内容。
    • 技术构成:需要 后端编程语言(如Java、Python、PHP、Node.js) + 数据库(如MySQL) + 前端模板。
    • 常见后缀:.php、.jsp、.aspx、.do,或者无后缀(通过路由重写)。
    • 生成方式:服务器程序从数据库调取数据,填入HTML模板,生成最终的HTML字符串再返回。
    • 优点:更新方便(只改数据库,所有页面同步)、交互性强、功能复杂(如搜索、购物车)。
    • 缺点:访问速度比静态慢(需运算)、对服务器性能要求高、开发维护复杂。

2.无状态HTTP

  • HTTP的无状态:是指HTTP协议对事务处理是没有记忆能力的,或者说服务器并不知道客户端处于什么状态。
  • 客户端向服务器发送请求后,服务器解析此请求,然后返回对应的响应,服务器负责完成这个过程,而且这个过程是完全独立的,服务器不会记录前后状态的变化,也就是缺少状态记录。
  • 这意味着之后如果需要处理前面的信息,客户端就必须重传,导致需要额外传递一些重复请求,才能获取后续响应,这种效果显然不是我们想要的。
  • 为了保持前后状态,肯定不能让客户端将前面的请求全部重传一次,这太浪费资源了,对于需要用户登录的页面来说,更是棘手。
  • 这时,两种用于保持HTTP链接状态的技术出现了,分别是Session和Cookie。
  • Session在服务端,也就是网站的服务器,用来保存用户的Session信息
  • Cookie在客户端,也可以理解为浏览器端,有了Cookie,浏览器在下次访问相同的网页时就会自动附带上它,并发送给服务器,服务器通过识别Cookie鉴定出是哪个用户在访问,然后判断此用户是否处于登录状态,并返回对应的响应。
  • Cookie里保存着登录的凭证,客户端在下次请求时只需要将其携带上,就不必重新输入用户名、密码等信息重新登录了
  • 因此在爬虫中,处理需要登录才能访问的页面时,一般会直接将登录成功后获取的Cookie放在请求头里面直接请求,而不重新模拟登录。

3 Session

  • Session,中文称之为会话,其本义是指有始有终的一系列动作、信息。例如打电话时,从拿起电话拨号到挂断电话之间的一系列过程就可以称为一个Session.
  • 在Web中,Session对象用来存储特定用户Session所需的属性及配置信息。这样,当用户在应用程序的页面之间跳转时,存储在Session对象中的变量将不会丢失,会在整个用户Session中一直存在下去。当用户请求来自应用程序的页面时,如果该用户还没有Session,那么Web服务器自动创建一个Session对象。当Session过期或被放弃后,服务器将终止该Session.

4.Cookie

  • Cookie,指某些网站为了鉴别用户身份,进行Session跟踪而存储在用户本地终端上的数据。
  • Session维持
    怎样利用Cookie保持状态呢?
    • 在客户端第一次请求服务器时,服务器会返回一个响应头中带有Set-Cookie字段的响应给客户端,这个字段用来标记用户。
    • 客户端浏览器会把Cookie保存起来,当下一次请求相同的网站时,把保存的Cookie放到请求头中一起提交给服务器。
    • Cookie中携带者Session ID相关信息,服务器通过检查Cookie即可找到对应的Session,继而通过判断Session辨认用户状态。
    • 如果Session当前是有效的,就证明用户处于登录状态,此时服务器返回登录之后才可以查看的网页内容,浏览器再进行解析便可以看到了、
    • 反之,如果传给服务器的Cookie是无效的,或者Session已经过期了,客户端将不能继续访问页面,此时可能会收到错误的响应或者跳转到登录页面重新登录。
    • Cookie和Session需要配合,一个在客户端,一个在服务器,二者共同协作,就实现了登录控制
  • 属性结构
    • 这里以百度为例,在浏览器开发者工具中打开Application选项卡,其中左侧有一部分叫Storage,在Storage内有一项即为Cookies,将其点开,如下图所示
      image
      • Name:Cookie的名称。Cookie一旦创建,名称便不可更改。
      • Value:Cookie的值。如果值为Unicode字符,则需要为字符编码。如果值为二进制数据,则需要使用BASE64编码
      • Domain:指定可以访问该Cookie的域名。例如设置Domain为.baidu.com,表示所有以baidu.com结尾的域名都可以访问该Cookie
      • Path:Cookie的使用路径。如果设置为/path/,则只有路径为/path/的页面才可以访问该Cookie。如果设置了/,则本域名下的所有页面都可以访问该Cookie。
      • Max-Age:Cookie失效时间,单位为秒,常和Expires一起使用,通过此属性可以计算出Cookie的有效时间。Max-Age如果为正数,则表示Cookie在Max-Age秒之后失效;如果为负数,则Cookie在关闭浏览器时失效,而且浏览器不会以任何形式保存该Cookie。
      • Size字段:Cookie的大小。
      • HTTP字段:Cookie的httponly属性。若此属性为True,则只有在HTTP Headers中才会带有此Cookie的信息,而不能通过document.cookie来访问此Cookie。
      • Secure:是否允许使用安全协议传输Cookie。安全协议有HTTPS和SSL等,使用这些协议在网络上传输数据之前会先将数据加密。其默认值时false。
  • 会话Cookie和持久Cookie
    • 从表面意思来看,会话Cookie就是把Cookie放在浏览器内存里,关闭浏览器之后,Cookie即失效;持久Cookie则会把Cookie保存到客户端的硬盘中,下次还可以继续使用,用于长久保持用户的登录状态。
    • 严格来说,其实没有会话Cookie和持久Cookie之分,只是Max-Age或Expires字段决定了Cookie失效时间。
    • 因此,一些持久化的网站实际上就是把Cookie的有效时间和Session有效期设置得比较长,下次客户端再访问页面时仍然携带之前得Cookie,就可以直接呈现登录状态。

5.常见误区

  • 在谈论Session机制的时候,常会听到一种误解:只要关闭浏览器,Session就消失了。
  • 可以想象一下生活中的会员卡,除非顾客主动对店家提出销卡,否则店家时绝对不会轻易删除顾客资料的
  • 对Session来说,也一样,除非程序通知服务器删除一个Session,否则服务器会一直保留。例如程序一般都是在我们注销操作时才删除Session.
  • 当我们关闭浏览器时,浏览器不会主动在关闭之前通知服务器自己将要关闭,所以服务器压根不会有机会知道浏览器已关闭。之所以会产生上面的误解,是因为大部分网站使用会话Cookie来保存Session ID信息,而浏览器关闭后Cookie就消失了,等浏览器再次链接服务器时,也就无法找到原来的Session了。
  • 如果把服务器设置的Cookie保存到硬盘上,或者使用某种手段改写浏览器发出的HTTP请求头,把原来的Cookie发送给服务器,那么再次打开浏览器时,仍然能够找到原来的Session ID,依旧保持登录状态。
  • 而且恰恰是由于关闭浏览器不会导致Session被删除,因此需要服务器为Session设置一个失效时间,当距离客户端上一次使用Session的时间超过这个失效时间时,服务器才可以认为客户端已经停止了活动,并删除掉Session以节省存储空间。
posted @ 2026-09-02 21:46  abner_pan  阅读(17)  评论(0)    收藏  举报