JAVA|我要把海誓山盟写进HTTP协议中,因为我是浪漫的程序猿


HTTP协议

  • 概述
  • 抓包工具 fiddler
  • HTTP协议的格式
    • HTTP请求
      • 请求行
        • URL
        • 方法
      • 请求报头
    • HTTP响应
      • 状态行
      • body
  • 构造HTTP请求
    • form标签
    • ajax
  • HTTPS协议
    • 加密
    • 魔高一尺
    • 道高一丈

概述
  • HTTP协议是前后端交互的“桥梁”
    JAVA|我要把海誓山盟写进HTTP协议中,因为我是浪漫的程序猿
    文章图片

  • 请求和响应都要基于网络
  • HTTP协议的模式:一发一收
    网络编程中还有其他的模式:多发一收、一发多收、多发多收
    一发一收是web开发中最主流的模式
  • 网络通信要经过WiFi、运营商的一些节点(交换机、路由器),黑客容易入侵这些设备,获取网络通信的数据,运营商也会分析设备上的数据
抓包工具 fiddler
  • 官网下载即可
  • fiddler读取你电脑上网卡的数据,相当于一个“代理”
    JAVA|我要把海誓山盟写进HTTP协议中,因为我是浪漫的程序猿
    文章图片

    JAVA|我要把海誓山盟写进HTTP协议中,因为我是浪漫的程序猿
    文章图片

  • 删除所有请求:选中任意一条请求,Ctrl+A(选中所有请求) delete
  • fiddler默认是不显示HTTPS的请求的,勾选响应内容,才可以显示HTTPS的请求
    JAVA|我要把海誓山盟写进HTTP协议中,因为我是浪漫的程序猿
    文章图片
    JAVA|我要把海誓山盟写进HTTP协议中,因为我是浪漫的程序猿
    文章图片

HTTP协议的格式 HTTP请求 JAVA|我要把海誓山盟写进HTTP协议中,因为我是浪漫的程序猿
文章图片

JAVA|我要把海誓山盟写进HTTP协议中,因为我是浪漫的程序猿
文章图片

请求行
方法 URL 版本号
URL URL就是我们常说的“网址”,标识互联网上唯一的资源地址
JAVA|我要把海誓山盟写进HTTP协议中,因为我是浪漫的程序猿
文章图片

  • 服务器地址
    标识互联网上的一个具体的主机(服务器)
    可以是IP地址,也可以是域名
    如 百度的IP地址:202.108.22.5
    百度的域名是:www.baidu.com
  • DNS系统专门负责域名解析,将域名解析成IP地址
  • 端口号
    标识主机(服务器)上的一个应用程序
    端口号省略时,浏览器会根据协议类型自动决定使用哪个端口,HTTP协议默认使用端口号80,HTTPS默认使用端口号443
  • 路径
    标识该主机程序上的哪个资源,如网页、图片…
  • query String
    客户端给服务器传递的参数
    以键值对的形式传递的
    键值对之间 & 分割
    键和值之间 = 分割
    这里的键值对是程序员自己定义的,外人根本看不懂
  • urlencode
    对特殊符号转译的过程就叫做urlencode
    url中的某些符号是有特殊含义的,如 # ? / … 如果queryString中有特殊字符, 为了避免url格式错误,queryString中的一些特殊符号会被转译,某些浏览器会对中文字符转译
    JAVA|我要把海誓山盟写进HTTP协议中,因为我是浪漫的程序猿
    文章图片
方法
  • 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
    JAVA|我要把海誓山盟写进HTTP协议中,因为我是浪漫的程序猿
    文章图片

    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获取
    JAVA|我要把海誓山盟写进HTTP协议中,因为我是浪漫的程序猿
    文章图片

HTTP响应 JAVA|我要把海誓山盟写进HTTP协议中,因为我是浪漫的程序猿
文章图片

JAVA|我要把海誓山盟写进HTTP协议中,因为我是浪漫的程序猿
文章图片

  • 响应正文就是显示在浏览器上的页面,所以响应正文的格式是HTML,很多服务器返回HTML都是压缩过的,节约网络带宽
状态行
版本号 状态码 状态码的描述
  • 状态码
状态码
1** 等会继续
2** 成功
3** 重定向
4** 客户端问题
5** 服务器问题
body
响应中body中的内容在网页上显示
构造HTTP请求 任何编程语言,只要能访问网络,都可以发送HTTP请求
form标签
//action中是服务器的地址 method中是方法,方法只支持GET和POST //name 和 password是提交给服务器的参数,在queryString中以键值对的形式存在

JAVA|我要把海誓山盟写进HTTP协议中,因为我是浪漫的程序猿
文章图片

//方法改为POST

JAVA|我要把海誓山盟写进HTTP协议中,因为我是浪漫的程序猿
文章图片

ajax ajax是JavaScript给HTTP发送请求的方式,而jQuery是JS的一个重要的第三方库,对ajax提供了一个封装的版本,可以通过jQuery实现ajax
  • 如何安装jQuery?
    直接在代码中引入jQuery的cdn链接!!!
cdn是互联网的一种基础设施,可以想象成一组服务器,是运营商提供的,存在的目的是为了加快用户访问速度。
客户端和服务器的距离比较远,传输数据的过程还要经过许多的节点(路由器),尤其是在传输大文件(网页的背景图片啥的)的时候,速度会慢;运营商在全国各地都有cdn服务器,互联网产品会把一下静态资源放到cdn服务器中(给钱的哦),用户访问时就可以从当地的cdn服务器中获取资源
jQuery.js就经常被各种网站访问到,所以jQuery也是可以放在cdn服务器上的
搜索“jQuery cdn”
JAVA|我要把海誓山盟写进HTTP协议中,因为我是浪漫的程序猿
文章图片

点击minifiedJAVA|我要把海誓山盟写进HTTP协议中,因为我是浪漫的程序猿
文章图片

复制src中的链接,粘贴到script标签中,自动下载jQuery
JAVA|我要把海誓山盟写进HTTP协议中,因为我是浪漫的程序猿
文章图片

  • 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不能跨域操作
ajax通过JS代码触发,JS代码在一个html文件中,这个文件的地址(本地文件)是域名1; 接受请求的服务器的地址是域名2;
ajax要求这两个域名是相同的,否则会报错的;如果服务器开放了跨域,域名不同的也能通过ajax的方式访问;
大部分服务器是不会开放跨域的,因此ajax一般只能访问自己的服务器,而无访问别人的服务器
所以通过ajax开发“爬虫”就别想了
HTTPS协议 HTTPS协议是在HTTP协议基础上加了一个“加密层”(TLS)
加密
  • 对称加密
    加密和解密用一个密钥;客户端生成一个对称密钥,用于加密,服务器用它来解密
  • 非对称加密
    服务器生成公钥私钥,公钥是公开发布的,私钥只有服务器知道;
    客户端用公钥加密,服务器用私钥解密;
  • 对称加密对机器资源的损耗是远远远低于非对称加密的
  • 对称加密传递内容,非对称加密传递对称密钥
    JAVA|我要把海誓山盟写进HTTP协议中,因为我是浪漫的程序猿
    文章图片

    一个服务器与许多的客户端连接,每个客户端都和服务器有一个自己的密钥;每个客户端在连接之前生成一个自己的密钥,在连接时把密钥告诉服务器,由服务器保存,但是被黑客入侵的网络设备可以轻而易举的获取密钥,后续的加密数据传输也就形同虚设。
    使用非对称加密传递密钥
  • 服务器生成一个公钥私钥密钥对,公钥发布出去(谁都可以获取,包括黑客);私钥只有自己知道
  • 客户端用公钥将对称密钥加密,密文传递给服务器,服务器用私钥解密,获取对称密钥
  • 黑客中途获取对称密钥的密文,没有私钥,也无法解密的
  • 客户端和服务器可以使用对称密钥进行密文传输了
JAVA|我要把海誓山盟写进HTTP协议中,因为我是浪漫的程序猿
文章图片

魔高一尺 中间人攻击
劫持服务器给客户端公钥,用自己的公钥代替,从而导致对称密钥泄露

黑客自己生成一个公钥(“黑公钥”)私钥(“黑私钥”)密钥对,在客户端向服务器询问公钥时,“狸猫换太子”,把“黑公钥”给客户端,同时获取真正的公钥,待到截取客户端用“黑公钥”加密对称密钥的密文,再用“黑私钥”解密,成功获取到对称密钥,为了防止被发现,用真正的公钥加密对称密钥,发送给服务器
JAVA|我要把海誓山盟写进HTTP协议中,因为我是浪漫的程序猿
文章图片

道高一丈 【JAVA|我要把海誓山盟写进HTTP协议中,因为我是浪漫的程序猿】引入第三方公证机构
通过第三方公证机构,向服务器发放证书(包含公钥),客户端拿到服务器的证书,去第三方公证机构检查,确认合法性,获取公钥
JAVA|我要把海誓山盟写进HTTP协议中,因为我是浪漫的程序猿
文章图片

    推荐阅读