HTTP协议
- 概述
- 抓包工具 fiddler
- HTTP协议的格式
-
- HTTP请求
-
- 请求行
-
- URL
- 方法
- 请求报头
- HTTP响应
-
- 状态行
- body
- 构造HTTP请求
-
- form标签
- ajax
- HTTPS协议
-
- 加密
- 魔高一尺
- 道高一丈
概述
- HTTP协议是前后端交互的“桥梁”
文章图片
- 请求和响应都要基于网络
- HTTP协议的模式:一发一收
网络编程中还有其他的模式:多发一收、一发多收、多发多收
一发一收是web开发中最主流的模式
- 网络通信要经过WiFi、运营商的一些节点(交换机、路由器),黑客容易入侵这些设备,获取网络通信的数据,运营商也会分析设备上的数据
- 官网下载即可
- fiddler读取你电脑上网卡的数据,相当于一个“代理”
文章图片
文章图片
- 删除所有请求:选中任意一条请求,Ctrl+A(选中所有请求) delete
- fiddler默认是不显示HTTPS的请求的,勾选响应内容,才可以显示HTTPS的请求
文章图片
文章图片
文章图片
文章图片
请求行
方法 URL 版本号
URL URL就是我们常说的“网址”,标识互联网上唯一的资源地址
文章图片
- 服务器地址
标识互联网上的一个具体的主机(服务器)
可以是IP地址,也可以是域名
如 百度的IP地址:202.108.22.5
百度的域名是:www.baidu.com - DNS系统专门负责域名解析,将域名解析成IP地址
- 端口号
标识主机(服务器)上的一个应用程序
端口号省略时,浏览器会根据协议类型自动决定使用哪个端口,HTTP协议默认使用端口号80,HTTPS默认使用端口号443 - 路径
标识该主机程序上的哪个资源,如网页、图片… - query String
客户端给服务器传递的参数
以键值对的形式传递的
键值对之间 & 分割
键和值之间 = 分割
这里的键值对是程序员自己定义的,外人根本看不懂 - urlencode
对特殊符号转译的过程就叫做urlencode
url中的某些符号是有特殊含义的,如 # ? / … 如果queryString中有特殊字符, 为了避免url格式错误,queryString中的一些特殊符号会被转译,某些浏览器会对中文字符转译
文章图片
- GET
触发GET请求:直接在浏览器地址框中输入URL,点击浏览器收藏夹中的链接;HTML中的一些标签(浏览器自动根据img中的src的URL构造出一个请求) ;使用JS在浏览器上构造一个请求(ajax);各种编程语言(只要能访问网络)都可以构造请求
GET请求的长度并没有限制,通过RFC2616可以得知URL的长度并没有限制 - POST
触发POST请求最常见的情景登入系统 - GET和POST的区别
- GET和POST在本质上没有区别,使用GET的场景可以使用POST,使用POST的场景可以使用GET
- GET习惯上把客户端的数据通过queryString传递给服务器(body一般是空的);POST习惯上把客户端的数据通过body传递给服务器(queryString一般是空的)(注意:只是习惯上,GET和POST的queryString和body 可以是空,也可以不为空)
- GET习惯上从服务器获取数据;POST习惯上是用于客户端向服务器传输数据 注意:只是习惯上
一般情况下,程序员会把GET请求的处理,实现成“幂等”;POST请求的处理,不要求实现成“幂等” 注意:只是一般情况 - GET请求可以被缓存,可以被浏览器保存在收藏夹中;POST不可以
- Host
表示该请求所对应的服务器的地址(可以是域名,也可以是IP)
- Content-Length
表示body的长度,单位是字节
- ContentType
表示body的样式
常见样式:
- application/x-www-form-urlencoded: form 此时body就类似于queryString的格式来组织数据(title=2&author=3)
- multipart/form-data: form 这种格式出现在HTML上传文件时
- application/json: body以JSON的格式组织数据(最常见的一种格式)
键值对的格式,{}
中放键值对;键和值之间:
分割;键值对之间,
分割
- User-Agent
文章图片
User-Agent的使用是为了使网站兼容各种浏览器,由于早期的浏览器功能不够强大,差异很大,User-Agent作用很大;比如某个服务器不支持视频,服务器得到这个浏览器的版本就不返回带视频的页面,返回不带视频的页面喽
现在浏览器的功能差不多了,User-Agent的作用不大,用来区分PC端和移动端
- Referer
表示这个页面从哪里来,header中也可能没有Referer
在浏览器地址栏中输入URL或点击收藏栏中链接 构造的请求中没有Referer
网站的广告项目就与Referer相关
- Cookie
Cookie中存键值对格式的数据,键值对之间;
分割;键和值之间=
分割;内容由程序员自定义,网站不同,cookie自然不同
Cookie就是浏览器提供的让程序员在客户端持久保存数据的一种机制,网页中的代码不能操作本地的硬盘(JS中无法读取本地文件),所以这些数据不能以文件的形式存储在硬盘中,只能以键值对的形式存储存储在硬盘上,通过浏览器管理
- Cookie中键值对的获取和使用
Cookie用于HTTP请求中
Cookie通过HTTP响应中的Set-Cookie获取
文章图片
文章图片
文章图片
- 响应正文就是显示在浏览器上的页面,所以响应正文的格式是HTML,很多服务器返回HTML都是压缩过的,节约网络带宽
版本号 状态码 状态码的描述
- 状态码
状态码 | |
---|---|
1** | 等会继续 |
2** | 成功 |
3** | 重定向 |
4** | 客户端问题 |
5** | 服务器问题 |
响应中body中的内容在网页上显示
构造HTTP请求 任何编程语言,只要能访问网络,都可以发送HTTP请求
form标签
//action中是服务器的地址 method中是方法,方法只支持GET和POST
//name 和 password是提交给服务器的参数,在queryString中以键值对的形式存在
文章图片
//方法改为POST
文章图片
ajax ajax是JavaScript给HTTP发送请求的方式,而jQuery是JS的一个重要的第三方库,对ajax提供了一个封装的版本,可以通过jQuery实现ajax
- 如何安装jQuery?
直接在代码中引入jQuery的cdn链接!!!
cdn是互联网的一种基础设施,可以想象成一组服务器,是运营商提供的,存在的目的是为了加快用户访问速度。搜索“jQuery cdn”
客户端和服务器的距离比较远,传输数据的过程还要经过许多的节点(路由器),尤其是在传输大文件(网页的背景图片啥的)的时候,速度会慢;运营商在全国各地都有cdn服务器,互联网产品会把一下静态资源放到cdn服务器中(给钱的哦),用户访问时就可以从当地的cdn服务器中获取资源
jQuery.js就经常被各种网站访问到,所以jQuery也是可以放在cdn服务器上的
文章图片
点击minified
文章图片
复制src中的链接,粘贴到script标签中,自动下载jQuery
文章图片
- GET
src="https://code.jquery.com/jquery-3.6.0.min.js">
- $ 是JS的一个对象,jQuery里面的各种方法就是$的成员
- url 是服务器的地址
- success 是回调函数,因为ajax是“异步”的,请求成功了,响应回来了,就由浏览器自动的调用这个函数
- data 响应的body
- status 响应的状态
src="https://code.jquery.com/jquery-3.6.0.min.js">
>
$.ajax({
url: 'http://42.192.83.143:8089/AjaxMockServer/info',
method: 'GET',
success: function(data, status){
console.log(data);
console.log(status);
}
});
- POST
>
$.ajax({
url: 'http://42.192.83.143:8089/AjaxMockServer/info',
method: 'POST',
contentType: 'text/plain',//请求body的类型,text开头的都视为文本,html和css也视为文本 text/html text/css
data: 'this is a boay',//注意是请求的body,不是响应的body
success: function(data, status){
console.log(data);
console.log(status);
}
});
ajax有一个重要的限制,默认情况下,ajax不能跨域操作HTTPS协议 HTTPS协议是在HTTP协议基础上加了一个“加密层”(TLS)
ajax通过JS代码触发,JS代码在一个html文件中,这个文件的地址(本地文件)是域名1; 接受请求的服务器的地址是域名2;
ajax要求这两个域名是相同的,否则会报错的;如果服务器开放了跨域,域名不同的也能通过ajax的方式访问;
大部分服务器是不会开放跨域的,因此ajax一般只能访问自己的服务器,而无访问别人的服务器
所以通过ajax开发“爬虫”就别想了
加密
- 对称加密
加密和解密用一个密钥;客户端生成一个对称密钥,用于加密,服务器用它来解密 - 非对称加密
服务器生成公钥私钥,公钥是公开发布的,私钥只有服务器知道;
客户端用公钥加密,服务器用私钥解密; - 对称加密对机器资源的损耗是远远远低于非对称加密的
- 对称加密传递内容,非对称加密传递对称密钥
文章图片
一个服务器与许多的客户端连接,每个客户端都和服务器有一个自己的密钥;每个客户端在连接之前生成一个自己的密钥,在连接时把密钥告诉服务器,由服务器保存,但是被黑客入侵的网络设备可以轻而易举的获取密钥,后续的加密数据传输也就形同虚设。
使用非对称加密传递密钥 - 服务器生成一个公钥私钥密钥对,公钥发布出去(谁都可以获取,包括黑客);私钥只有自己知道
- 客户端用公钥将
对称密钥
加密,密文传递给服务器,服务器用私钥解密,获取对称密钥
- 黑客中途获取
对称密钥
的密文,没有私钥,也无法解密的 - 客户端和服务器可以使用
对称密钥
进行密文传输了
文章图片
魔高一尺 中间人攻击
劫持服务器给客户端公钥,用自己的公钥代替,从而导致对称密钥泄露
黑客自己生成一个公钥(“黑公钥”)私钥(“黑私钥”)密钥对,在客户端向服务器询问公钥时,“狸猫换太子”,把“黑公钥”给客户端,同时获取真正的公钥,待到截取客户端用“黑公钥”加密对称密钥的密文,再用“黑私钥”解密,成功获取到对称密钥,为了防止被发现,用真正的公钥加密对称密钥,发送给服务器
文章图片
道高一丈 【JAVA|我要把海誓山盟写进HTTP协议中,因为我是浪漫的程序猿】引入第三方公证机构
通过第三方公证机构,向服务器发放证书(包含公钥),客户端拿到服务器的证书,去第三方公证机构检查,确认合法性,获取公钥
文章图片
推荐阅读
- Java|记一次TCP TIME_WAIT引发的血案
- 为什么不能使用 BigDecimal 的 equals 方法做等值比较
- JAVA|第十一届蓝桥杯校内赛/校内选拔赛(2020蓝桥杯校选3-java)部分解题思路
- java|五个经典的破坏双亲委派场景,Java被啪啪打脸
- 人工智能|温故知新-软件生存周期和过程模型
- java|温故知新-什么是软件工程
- 科普学习|微服务架构设计和拆分
- java|四种常用的微服务架构拆分方式
- 面试官(Java 设计原则中,为什么反复强调组合要优先于继承())