当前位置: 首页 > news >正文

【HTTP】请求“报头”,Referer 和 Cookie

Referer

描述了当前这个页面是从哪里来的(从哪个页面跳转过来的)

浏览器中,直接输入 URL/点击收藏夹打开的网页,此时是没有 referer。当你在 sogou 页面进行搜索时,新进入的网页就会有 referer image.png|423

有一个非常典型的用途:广告中

  • 在搜索广告中,都是按照点击计费的,双方都要进行次数统计
  • 一个公司可能会在很多平台上投放广告,要知道这个点击是从哪个平台上来的,就可以看 referer

referer 是否会被篡改呢?
这种情况在十年前左右是非常常见的,运营商(中国移动/中国联通/中国电信)进行篡改。

  1. 有动机

    • 他们自己有广告系统,就可以把 referer 改成他们自己广告系统的 referer(比如,明明是从搜狗进入的改为从他们的网站进入的)
  2. 有能力

    • 运营商提供了通信设施,在对应的路由器/交换机上部署程序,让程序解析 HTTP 数据,把 referer 改成自己的就可以了

这种行为叫“运营商劫持”。当年,互联网那个还是个新鲜东西,对应的法律还不是特别的完备。官司当然能打,大了官司也肯定能打赢,但是中间花的时间一定会非常长(之前没有可以参考的法律条文或者是相关案例),再加上运营商手下也有强悍的法务团队,进行反复拉扯。赢了官司,输了买卖。

当时百度就联合搜狗、360 这些广告平台,一起去打官司。光法律还不够,在技术上还要进行反制,让你这样的劫持操作不能继续下去。这时候,HTTPS 就登场了。

HTTPS 中的 S 就是 SSL(网络中用于加密的协议),加密就能把 headerbody 进行加密,网络上传输就是密文了。运营商想要修改,就得先破解,就算你能解密,你也篡改不了(一旦修改就能被用户的浏览器感知到)

当时这些广告平台就纷纷升级成了 HTTPS,后续越来越多的网站都引入了 HTTPS。直到今天,现在网络上 HTTPS 的网站是绝对的主流,反而纯 HTTP 的网站很少见了

Cookie

非常重要的报头中的属性,要更复杂一些。程序员自定义的键值对


浏览器与持久化存储

Cookie 本质上是一个浏览器这边,进行本地持久化存储(数据要存储到硬盘中)数据的机制

浏览器作为电脑上的程序,能否直接读写本地磁盘文件呢?

  • 可以,因为系统提供了 API 用来操作文件,作为一个程序当然可以调用这些 API 来操作了

浏览器上运行的网页,能否通过浏览器提供的 API 来读写本地磁盘文件呢?

  • 理论可行,但浏览器禁止了这种做法(浏览器并没有给网页提供这样的 API),一个网页不能直接读写你的硬盘文件
  • 禁止这种做法是为了安全性。随手一点,网页就打开了。万一打开的是恶意网站,此时人家通过网页直接把你电脑上的所有学习资料都给你删了,必然会造成重大损失

但是确实有些网站,是需要把一些信息保存到浏览器这边,进行持久保存的。比如当前登录用户的身份信息。浏览器退而求其次,给网页提供了这样的 API,能够有限度(按照键值对的格式)的存储数据,而不能随意访问文件系统

Cookie 的作用

Cookie 就是这样的一种存储机制,还有 LocalStorageindexDB。他们都是浏览器提供的网页可以存储数据的机制

HTTP 请求中的 Cookie 字段,就是把本地存储的 Cookie 信息发送到服务器这边。HTTP 响应中会有一个 Set-Cookie 字段,就是服务器告诉浏览器你要在本地保存哪些信息。这些都是键值对结构,程序员自定义的

Cookie 的作用就非常类似于去医院看病的流程

  1. 先去挂号,办理一个就诊卡
  2. 来到了脑科,见到医生,医生对我说的第一句话:先刷下就诊卡就诊卡上面保存着我这边的一些患者信息,刷卡之后,医生就一目了然了。医生让我去做个 B 超
  3. 来到了对应科室,医生第一句话还是:先刷下就诊卡。刷卡之后,医生就看到了我要做什么检查
  4. 回到脑科,拿着单子给医生看结果,医生见到我们还是要我们刷就诊卡。之后医生就给我们开药
  5. 来到药房
  6. 来到护士站,看就诊卡,配药打针

  • 每次来到一个新的科室,都可以认为是客户端给服务器发起了一个新的请求
  • 每次刷的就诊卡,就相当于是使用 Cookie 中的信息,来让服务器对我这个客户端有了一个清楚的认识
  • 就诊卡本身,就是客户端手里拿着的持久存储数据的机制,就是 Cookie

几个重要结论

1. Cookie 从哪里来

服务器返回给浏览器的,通常都是首次访问/登陆成功之后

2. Cookie 到哪里去?

Cookie 会存储在浏览器本地主机的硬盘上,后续每次访问服务器都会带上 Cookie。不同的客户端,保存的 Cookie 是不同的。即使是一个主机,使用不同的浏览器,Cookie 大概率也不同

3. Cookie 中存什么?

键值对格式的数据。这里的内容都是程序员自定义的,和 query string 一样,外人无法知晓。不同网站的 Cookie 都是不一样的(不是一家的,键值对格式就不一样)

4. Cookie 在浏览器这边如何组织?

在硬盘本地保存,是按照不同的域名为维度分别存储。你的浏览器访问百度,有一组 Cookie;访问搜狗,也有一组 Cookie。他们彼此之间是隔离的,不会相互影响image.png|334

  1. Cookie 的用途是什么?

用来在客户端保存数据,其中最主要的是保存用户的身份标识,这样服务器就可以通过标识来区分用户了。
一些其他的业务数据一般不会存储到 Cookie 中,Cookie 随时可以删除掉,把业务数据存储在服务器,通过 Cookie 中的身份标识找到对应的数据(上面开的药,信息就不会存在就诊卡中,而是保存在医院的服务器中,可以通过就诊卡中的数据在医院服务器中找到要的信息)

浏览器中的账号密码不会在 Cookie 中保存,Cookie 是要传输给服务器的。一般浏览器保存的密码都是明文密码,明文密码放到 Cookie 中当然不合适。虽然有 HTTPS 能加密,但 HTTPS 是侧重于“不能被篡改”,而不是“不能被解密”


一个 HTTP 请求中,有以下部分可以携带程序员自定义的数据:

  1. query string
  2. Cookie
  3. body
  4. URLpath
  5. path
    之后使用 Spring 搭建网站,就是围绕上述几个部分,展开进一步的编程

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • Windows控制台中文乱码怎么解决?(nes,一些exe窗口程序)
  • k8s证书过期处理
  • 【2025】中医药健康管理小程序(安卓原生开发+用户+管理员)
  • C#基础知识-.NET,变量,容量单位,数据类型
  • MATLAB系列05:自定义函数
  • android设置实现广告倒计时功能
  • 基于协同过滤+python+django+vue的音乐推荐系统
  • MVC应用单元测试以及请求参数的验证
  • 你必须知道的C语言问题(12)
  • Linux 基础IO 1
  • LeetCode746:使用花费最小爬楼梯
  • Flutter-底部选择弹窗(showModalBottomSheet)
  • BMC 虚拟i2c访问PCA9545(switch芯片)后面的设备,为什么找不到PCA9545?
  • Leetcode 470. 用 Rand7() 实现 Rand10()
  • 【linux】kill命令
  • @angular/forms 源码解析之双向绑定
  • android图片蒙层
  • Apache的基本使用
  • css属性的继承、初识值、计算值、当前值、应用值
  • Hibernate【inverse和cascade属性】知识要点
  • JavaScript设计模式系列一:工厂模式
  • Joomla 2.x, 3.x useful code cheatsheet
  • Nginx 通过 Lua + Redis 实现动态封禁 IP
  • Python连接Oracle
  • react-core-image-upload 一款轻量级图片上传裁剪插件
  • SegmentFault 社区上线小程序开发频道,助力小程序开发者生态
  • Twitter赢在开放,三年创造奇迹
  • Vue UI框架库开发介绍
  • 阿里云应用高可用服务公测发布
  • 对象引论
  • 区块链共识机制优缺点对比都是什么
  • 三栏布局总结
  • 微信小程序:实现悬浮返回和分享按钮
  • 这几个编码小技巧将令你 PHP 代码更加简洁
  • 微龛半导体获数千万Pre-A轮融资,投资方为国中创投 ...
  • 支付宝花15年解决的这个问题,顶得上做出十个支付宝 ...
  • ​ArcGIS Pro 如何批量删除字段
  • ​LeetCode解法汇总2696. 删除子串后的字符串最小长度
  • !!Dom4j 学习笔记
  • (20)目标检测算法之YOLOv5计算预选框、详解anchor计算
  • (k8s中)docker netty OOM问题记录
  • (ZT) 理解系统底层的概念是多么重要(by趋势科技邹飞)
  • (保姆级教程)Mysql中索引、触发器、存储过程、存储函数的概念、作用,以及如何使用索引、存储过程,代码操作演示
  • (附源码)springboot建达集团公司平台 毕业设计 141538
  • (过滤器)Filter和(监听器)listener
  • (十一)图像的罗伯特梯度锐化
  • (转)AS3正则:元子符,元序列,标志,数量表达符
  • (转)关于如何学好游戏3D引擎编程的一些经验
  • (转)微软牛津计划介绍——屌爆了的自然数据处理解决方案(人脸/语音识别,计算机视觉与语言理解)...
  • .NET : 在VS2008中计算代码度量值
  • .net CHARTING图表控件下载地址
  • .NET Core 将实体类转换为 SQL(ORM 映射)
  • .NET Framework、.NET Core 、 .NET 5、.NET 6和.NET 7 和.NET8 简介及区别
  • .NET Standard / dotnet-core / net472 —— .NET 究竟应该如何大小写?
  • .net操作Excel出错解决