JavaEE之HTTP协议 Ⅱ

news2025/8/7 7:49:34

文章目录

  • 一、认识请求"报头"(header)
    • 1.HOST
    • 2.Content-Length
    • 3.Content-Type
    • 4.User-Agent (简称 UA)
    • 5.Referer
    • 4.Cookie
  • 二、HTTP响应详解
    • 1. 认识"状态码"(status code)
    • 2. Content-Type
    • 3. 如何构造HTTP请求
  • 总结

一、认识请求"报头"(header)

这里的键值对,都是标准规定的,有特定含义的,当然这里也可以放一些自定义的 键值对

1.HOST

表示服务器主机的地址和端口

在这里插入图片描述

💥注意:

URL里的ip和端口和HOST里的ip和端口不一定完全一样~
当请求时经过代理来访问的时候,是可能会不一样的~ (这一点在Fiddler没体现出来)
在这里插入图片描述

2.Content-Length

表示 body 中的数据长度(用于解决粘包问题)

3.Content-Type

表示请求的 body 中的数据格式
body中的数据可以放很多种格式,存不同的格式,对于接收方来说,解析方式是截然不同的~

在这里插入图片描述

上面的两个字段不一定有,但是如果有一个就会有另一个~
如果请求没有body(GET)就没有这两个字段~
如果请求有body(POST),一定有这两个字段~

常见选项:

  • application/x-www-form-urlencoded: 通过form 表单构造的请求,就是这个Content-Type HTML的form标签
    此时 body 的格式形如: title=test&content=hello 这个格式就是和query string 是一样的,里面可以放多个键值对,键值对之间使用 & 来分割,键和值之间使用 = 来分割 (并且这里也是需要urlencode的)
  • multipart/form-data: form 表单提交的数据格式(通常用于提交图片/文件),body 格式形如:
Content-Type:multipart/form-data; boundary=----
WebKitFormBoundaryrGKCBY7qhFd3TrwA 
------WebKitFormBoundaryrGKCBY7qhFd3TrwA 
Content-Disposition: form-data; name="text" 
title 
------WebKitFormBoundaryrGKCBY7qhFd3TrwA 
Content-Disposition: form-data; name="file"; filename="chrome.png" 
Content-Type: image/png 
PNG ... content of chrome.png ... 
------WebKitFormBoundaryrGKCBY7qhFd3TrwA--
  • application/json: 数据为 json 格式(比较主流), body 格式形如:
{"username":"xxxxx","password":"xxxx","code":"xxxxl","uuid":"dxxxxx
xxxxx"}

4.User-Agent (简称 UA)

在这里插入图片描述

现在UA仍然是有用的!! 可以根据UA来识别出PC平板还是手机,分别开发出不同版本的页面,来去满足不同设备的需求!
但是现在又出现了一个"响应式页面",通过特殊的CSS和JS,感知当前浏览器窗口的尺寸,根据不同的尺寸,重新排列页面布局!!
这样就可以写一份页面兼容多个设备了~~

随着时间推移,UA几乎已经完成历史使命了~
UA即使失去了最终的作用,但是至少可以用来在服务器端统计用户的设备情况(大数据阶段的作用)

小结:

UA主要包含的信息,就是操作系统信息和浏览器信息,描述了用户在使用啥样的设备上网!!

5.Referer

表示这个页面是从哪个页面跳转过来的,形如:

Referer:https://www.sogou.com/

Referer指的就是当前这个页面是从哪个页面跳转过来的(上级页面是什么),Referer不是每个地址都有的!!
在浏览器里直接输入一个地址,就没有Referer,直接点收藏夹里的网址也没有Referer


🎑举个使用Referer的例子:
按照点击计费的广告(CPC广告):

得统计点击的次数,根据点击的次数,和广告主来结算广告费~
❓那点了多少次谁来统计呢?
答案是双方都统计,然后最后对一下数据
❓广告公司如何统计?
每次点击跳转,其实都是会先访问广告公司的计费服务器,计费服务器再返回一个重定向报文,跳转到广告主的广告那边~
请求先给了计费服务器(在这里就可以统计点击的数量),返回一个js代码,来进行页面跳转.
❓广告主如何统计?
看服务器收到的请求中,有多少Referer是来自于广告公司的

但是这里面有安全问题❗❗
比如本来Referer是腾讯的,然后被改成别的了:
在这里插入图片描述

只要在用户分给广告主请求的中间的路径上,对请求报文进行偷龙转凤,就可以通过这个设备把Referer给改了!!!

❓如何在技术上解决这个问题?
关键要点:加密!! 使用HTTPS!! chrome浏览器如果遇到了HTTP的网站,直接弹框告警,就会让网站蒙受不小的损失

4.Cookie

Cookie 也是请求头的一个重要字段,是浏览器本地存储数据(存到硬盘上)的一种机制~
在这里插入图片描述
但是浏览器专门提供了特殊的api给网页使用,可以让网页存储一些简单的数据~

浏览器提供的持久化存储方案,有好几种:

  • Cookie是最经典的一种方案(最老)
  • LocalStorage是比较新的一种方案
  • indexDB是更新的方案

Cookie:

在这里插入图片描述

cookie这里的键值对都是简单的字符串,使用cookie作为保存数据的手段,只能存一些简单的键值对信息,简单的字符串,存不了太复杂的(比如图片,视频,flash)

比如可以使用cookie存:

  1. 上次访问页面的时间
  2. 当前网页的访问次数
  3. 当前访问页面的身份信息(身份标识,id)

在这里插入图片描述

  1. cookie从哪来的
    cookie是存储在浏览器的,来源是服务器
    在这里插入图片描述
    在服务器返回的响应报文中,可以在响应header中包含一个或多个 Set-Cookie这样的字段~ 在header中存的是键值对,Set-Cookiekey,value就是cookie里的值~ (程序员在服务器代码中构造出来的)
    浏览器看到Set-Cookie就会把这样的数据给保存在浏览器本地
    在这里插入图片描述
  2. cookie到哪里去
    来自于服务器,存储于浏览器,还要再回到服务器~
    当浏览器保存了cookie之后,下次浏览器访问同一个网站,就会把之前本地存储的cookie再通过http请求 header 中的 cookie 给带回去

❓为啥数据要转一圈?
服务器要服务的客户端是很多的,这些不同的客户端就应该要有不同的数据,此时我们就把对应的客户端数据就发给各自客户端的浏览器,大家各存各的,然后下次访问的时候,再把数据带回去,服务器就知道每个客户端的相关情况了~


💌cookie典型应用场景:

最常用的场景就是在客户端维持登录状态~ (不是唯一场景)
在某个网站上登录成功后,浏览器就会记住当前登陆用户的身份信息~
然后接下来访问网站的其他页面,服务器也能知道是谁在登陆(比如登录了bilibili账号后,不用看每个视频都重新登陆一次~ )

在这里插入图片描述
刚才的身份信息,在这个网站的任意子网站,都是可以使用的,但是如果换了个网站,就需要重新注册身份信息了~
Cookie只是针对当前的 域名 下的网站生效!


在这里插入图片描述

刚才看到的大部分路径都是/. ,意思是在整个网站下,所有的路径都是生效的~
但是有些页面特殊,需要特定的cookie,这些特定的cookie在别的页面中无意义!


❓把Cookie删掉是什么样的效果呢?

在这里插入图片描述
但是重新登陆Cookie就会回来了~


上述介绍的这一系列流程,是cookie在实现登录验证的时候,涉及到的情况~ 如果针对某个网站抓包,看到的cookie的情况会比上述介绍的情况更复杂一些~

目前先介绍到这里~
后续再看看cookie更纯粹的工作过程~

二、HTTP响应详解

1. 认识"状态码"(status code)

状态码是一个数字,描述了当前这次请求的"状态"(成功,失败,失败的原因)
HTTP的状态码是有明确规定的~

状态码种类有很多:

在这里插入图片描述等等…

主要认识其中常见的状态码即可~

  • 200 表示访问成功在这里插入图片描述
    响应的首行中也会包含状态码在这里插入图片描述

  • 404 Not found
    学习后端开发经常见到的一个错误!

问题的原因,就是请求路径写错了
请求里包含url,url里包含路径(路径表示你要访问服务器上的资源)
如果你想访问的资源,服务器上没有(路径写错了),此时就会返回404
在这里插入图片描述

  • 403 Forbidden
    访问被拒绝 (没有权限),比如不在登陆状态访问gitee私人仓库
    在这里插入图片描述
    404403 本质上都是客户端这里的问题,所以都用4开头

  • 500 internal Sever Error 服务器内部错误
    服务器代码执行过程中,出异常了(意味着服务器代码bug了)

  • 504 Gateway Timeout
    访问超时了,一般就是服务器请求量很大的时候,对于服务器的负荷就比较重,就会返回请求比较慢,等待超时了,就会显示504

500 504 这种都是服务器出问题了,就都使用5 来开头

  • 302 重定向
    重定向:访问一个旧的URL,自动转移到新的URL上

1.呼叫转移 : 当有人给旧的号码打电话,自动的转接到新号码上
2.服务器的地址迁移,过渡阶段就可以搞个重定向,访问旧域名就跳转到新域名~

状态码的类别:
在这里插入图片描述

状态码的彩蛋:

  • 418 I’m a teapot 愚人节笑话
    在这里插入图片描述
    这个状态码是明确的写在HTTP对应的RFC标准文档中的~

2. Content-Type

响应中的 Content-Type 常见取值有以下几种:

  • text/html : body 数据格式是 HTML
  • text/css : body 数据格式是 CSS
  • application/javascript : body 数据格式是 JavaScript
  • application/json : body 数据格式是 JSON

3. 如何构造HTTP请求

  1. 浏览器自己构造的(地址栏里写url,构造出get请求)
    点击a标签,也会构造get请求
    img,link,script,也会构造`get请求
  2. form表单
    在这里插入图片描述
    在这里插入图片描述
    如果方法是post方法,就需要借助抓包软件查看body~

form最关键的作用,就是给服务器传键值对~

  1. ajax 各种http方法都能构造

form构造的http请求一定会触发页面跳转的 ajax默认发起的请求不会引起跳转,当然,也可以手动控制跳转~


页面跳转,不是一个好事,开销大,时间慢,用户就需要等待

使用ajax不去触发跳转,就可以达到"局部刷新"这样的效果~

❓如何在代码中在这里插入图片描述
使用ajax构造http请求:
ajax api是属于浏览器原生自带的,但我们通常使用第三方库封装好的api,代替原生的api

如: jquery,可以直接通过网络地址,把jquery引入到代码中

虽然ajax方法的的参数只有一个,但是里面是一个对象

  • get:
    在这里插入图片描述

  • post:
    在这里插入图片描述

直接打开ajax.html :
在这里插入图片描述

跨域:一个页面在域名a之下,尝试通过ajax访问域名b里的资源
这种情况,浏览器默认是禁止的,除非b网站返回的响应明确告诉浏览器,允许跨域访问!
市面上看到的大部分网站/服务器 基本都是不允许跨域的

❓这种情况如何解决?

自己写个服务器,页面放到自己的服务器上,页面访问自己服务器的资源


以上都是基于前端(围绕浏览器)来构造的HTTP请求,但是不用浏览器也是可以的❕❕

但凡是某个编程语言,可以操作网络(能够进行socket编程,就一定可以构造http请求(往一个tcp socket里写一个符合http协议格式的字符串)

postman 就属于是一个专门用来构造HTTP请求的第三方工具,主要用来帮助我们进行 接口测试

🎂接口测试 :
后端写好服务器之后,需要提供一些HTTP的接口(可以接受一些HTTP请求,返回不同的响应)
程序员就得验证下接口对不对,就可以使用前面说的这些方法来发(如浏览器地址栏,a标签,form,ajax),但是以上的方法比较麻烦,于是就有大佬专门开发了用来构造http请求的工具,更方便的来构造http请求了~

总结

在这里插入图片描述

你可以叫我哒哒呀
本篇到此结束
“莫愁千里路,自有到来风。”
我们顶峰相见!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/15658.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

php资源列表|开发者应知晓

PHP PSR 代码标准 官网: https://www.php-fig.org原文: https://github.com/php-fig/fi...中文: https://psr.phphub.orgPHP资源列表PHP设计模式PHP知识技能树PHP资源站 PHP WeeklyCodeVisuallyPHP LeagueKnpLabs开发项目 FastAdmin - 基于 ThinkPHP5 + Bootstrap 的极速后台开…

ubuntu搭建Elasticsearch过程与问题

目录 一.下载Elasticsearh 二.解压 创建需要的文件目录 三.修改配置文件 四.遇到的问题 1.root账号启动问题 2.创建文件不授权切换到非root用户test的时候报错 3.启动最后还是报错 4.浏览器请求http://localhost:9200 报错:received plaintext http traffic…

【python】算法与数据结构作业记录分析

目录 算法与数据结构实验题 9.21 朋友圈 ★实验任务 ★数据输入 ★数据输出 输入示例 输出示例 代码实现 效果展示 算法与数据结构实验题 9.24 水杯 ★实验任务 ★数据输入 ★数据输出 输入示例 输出示例 代码实现 效果展示 算法与数据结构实验题 9.21 朋友圈 …

实验(四):LCD1602显示实验

一、实验目的与任务 实验目的: 1. 掌握LCD1602显示控制方法; 2. 掌握利用Proteus进行单片机控制系统的仿真及调试方法。 3. 掌握单片机开发板的使用。 任务: 1.根据要求编写程序,并写出原理性注释; 2. 将检查程序运行的…

Java入门项目——读书管理系统

Java简单实现读书管理系统一、前言二、思路及整体框架三、代码展示1.有关读书包(Book)2.有关用户包3.有关操作书的包一、前言 相信有很多小伙伴学习完了【JavaSE】基础语法,想知道自己到底学的怎么样,或则学完不知道这么把知识点…

JavaFX之Scene Builder的使用(开发一款GUI小工具原来这么简单)

文章目录一、前言二、JavaFX与Scene Builder下载三、Scene Builder的使用四、详细教学(示例)4.1 环境配置4.2 创建fxml文件以及Controller类文件4.3 自定义界面4.4 运行我们的程序五、拓展总结博主个人社区:开发与算法学习社区 博主个人主页&…

创建.gitignore文件并使用

创建 .gitignore文件 第一种方式 在项目根目录下直接创建一个文件,后缀改成 .gitignore 即可。 第二种方式 用git创建,到根目录下,执行 touch .gitignore,即可看见目录下已经出现了该忽略文件。 添加忽略规则 # 忽略所有以 …

httpOnly对于抵御Session劫持的个人小结

Ⅰ 什么是http only?起到什么防护作用? cookie中设置了HttpOnly属性,那么通过js脚本将无法读取到cookie信息,主要防护的攻击手段:XSS不能通过document对象直接获取cookie Ⅱ 怎么绕过http only的防护(三种&#xff…

5、CSS——三种样式和样式优先级、CSS中颜色设置方式、标签选择器和基本选择器的优先级

目录 一、行内样式 二、内部样式 三、外部样式 1、创建外部样式步骤 2、引入外部样式的两种方式 2.1 第一种 2.2 第二种 3、style标签内的注释符号 四、样式优先级 五、CSS中颜色设置方式 1、使用颜色的英文单词 2、使用十六进制表示法 3、使用rgb()表示法…

Redis分区/分片详解

分区/分片详解 分区是分割数据到多个Redis实例的处理过程,因此每个实例只保存key的一个子集。 如果只使用一个redis实例时,其中保存了服务器中全部的缓存数据,这样会有很大风险,如果单台redis服务宕机了将会影响到整个服务。解决的…

easyExcel不同版本按照模板导出

Java解析、生成Excel比较有名的框架有Apache poi、jxl。但他们都存在一个严重的问题就是非常的耗内存,poi有一套SAX模式的API可以一定程度的解决一些内存溢出的问题,但POI还是有一些缺陷,比如07版Excel解压缩以及解压后存储都是在内存中完成的…

力扣(LeetCode)7. 整数反转(C++)

模拟 整数反转,需要一个中间变量 ansansans , 循环存入 xxx 的最低位 x%10x\%10x%10, 然后 xx/10x x/10xx/10 ,得到 xxx 新的最低位 。如果进入新的循环,ans10ans\times 10ans10 ,让上一次的 ansansans 十…

Makefile 基础(一) —— 自定义变量、预定义变量、自动变量

目录 一、自定义变量 1、定义变量 2、使用变量 3、修改变量的值 二、预定义变量 三、自动变量 一、自定义变量 1、定义变量 变量定义有两种方式,一种会在使用的时候递归展开,一种是直接赋值。两种定义方式如下: 递归展开&#xff1a…

Servlet的基本使用

目录 一、Servlet是什么 二、Servlet的基本使用 1、创建项目 2、引入依赖 3、创建目录 4、编写代码 5、打包程序 6、部署程序 7、验证程序 三、优化部署方式 1、安装Smart Tomcat 2、使用Smart Tomcat 四、使用Servlet时常见的错误 1、404 2、405 3、500 4、…

Linux文件目录之查看篇【cat、more、less、head、tail、>、>>】【简直不要太详细】

目录cat 查看文件内容morelessecho:将输入内容到控制台>指令和>>指令: >输出重定向 ,>>追加head:tailcat 查看文件内容 cat【选项】 【要查看的文件】 -n 显示行号 注意:cat只能浏览文件,并不能修…

第二章--应用层

2.1应用层协议原理 研发网络应用程序的核心是写出能够运行在不同的端系统和同构网络彼此通信的程序,将应用软件限制在端系统,从而促进大量的网络应用程序的迅速研发和部署。 2.1.1网络应用程序体系结构 应用程序的体系不同于网络的体系结构&#xff0c…

实验(二):单片机数据区传送程序设计

一、实验目的与任务 实验目的: 1. 掌握单片机C语言程序设计和调试方法; 2. 了解单片机RAM中的数据操作。 任务: 1.根据要求编写程序,并写出原理性注释; 2. 检查程序运行的结果,分析一下是否正确&#xff1…

leetcode 42.接雨水,leetcode 503. 下一个更大元素Ⅱ

“即使到不了远方,心中也要有远方的模样。” 文章目录1.leetcode 503. 下一个更大元素Ⅱ1.1 详细思路及步骤1.2 java版代码示例2.leetcode 42.接雨水2.1 详细思路及步骤2.2 java版代码示例1.leetcode 503. 下一个更大元素Ⅱ 1.1 详细思路及步骤 这题基本上和昨天总结…

GoWeb从无到有(读取配置文件、gin、gorm)

GoWeb从无到有 – 读取配置文件、gin、gorm 创建go项目,结构如下 1. golang读取配置文件 引入包 go get -u gopkg.in/ini.v1在main.go的同级目录创建config文件夹,在文件夹中创建配置文件 config.ini # 项目配置 [app] Port8010 # mysql配置 [mysql] …

C++初阶 Stack和Queue的介绍和使用

作者:小萌新 专栏:C初阶 作者简介:大二学生 希望能和大家一起进步 本篇博客介绍:本篇博客会简单的介绍STL中的栈和队列 本章目标 复习下栈这种数据结构特点知道怎么使用STL中的栈复习下队列这种数据结构的特点知道怎么使用STL中…