精华内容
下载资源
问答
  • 浏览器请求接口弹窗报错600处理

    万次阅读 2021-03-15 09:42:11
    近期有开发一个广告模块,用来在用户loading的时候展示一些新品动图,接口开发完成后,自测冒烟都跑的没问题,提测后突然接到测试的反馈,有个接口调不通,浏览器用的chrome。 现场情况 调用接口查询时出现以下弹窗:...

    背景

    近期有开发一个广告模块,用来在用户loading的时候展示一些新品动图,接口开发完成后,自测冒烟都跑的没问题,提测后突然接到测试的反馈,有个接口调不通,浏览器用的chrome。

    现场情况

    调用接口查询时出现以下弹窗:
    在这里插入图片描述
    弹窗提示:
    请求失败:600 网络未连接或者请求配置发生错误
    异常接口:
    api/service-mall-admin/admin/mart_ad_config/list?pageNo=1&pageSize=10&adName=1
    请求方式:GET
    注意:测试同事反馈,此接口不加adName字段访问是正常的,加了之后就报错无返回。

    处理过程

    首先自测时都是可以的:
    通过我自己的浏览器调接口没问题;
    测试测得其他接口都没问题;
    通过postman调接口没问题;
    后台日志显示测试的请求没有到达接口网关;
    可以确定代码时没问题的,测试的请求根本没有发生网络调用

    初步定位

    测试同事的网络或者浏览器配置有问题
    1.更换浏览器重试,问题得到解决,同时验证了网络没问题。
    所以单独增加了参数adName后,chrome浏览器有做了什么操作么。
    我也使用的chrome浏览器却没有重现这个问题,直接找测试要到了他的chrome插件列表,大概率是插件引起的。
    插件列表如下:
    在这里插入图片描述
    对,就是图中画框的这个插件,尝试插件开关后,到达这个插件时,接口通了。

    最终结论

    测试浏览器中装了额外的插件,但是接口添加了adName字段后,无法访问。
    一块看看这个uBlock Origin插件是做什么的。
    一款高效的请求过滤工具:占用极低的内存和CPU,和其他常见的过滤工具相比,它能够加载并执行上千条过滤规则。用法:点击弹出窗口中的电源按钮,uBlock₀ 将对当前网页永久禁用/启用过滤功能。 它只控制当前网页的请求过滤,而不是一个全局开关。 它只控制当前网页的请求过滤,而不是一个全局开关。
    看这个描述是过滤弹窗小广告的,针对网页的请求过滤,由于添加了adName字段,导致请求被过滤。
    修改方向:将包含ad字段名的,修改成config开头的字段名称,之后避免使用ad开头的字段。

    展开全文
  • 修改chrom请求头,修改chrom请求头,
  • 最近,终于要把《WEB请求处理系列》提上日程了,一直答应小伙伴们给分享一套完整的WEB请求处理流程:从浏览器、Nginx、Servlet容器,最终到应用程序WEB请求的一个处理流程,前段时间由于其他工作事情的安排,一直未...

    最近,终于要把《WEB请求处理系列》提上日程了,一直答应小伙伴们给分享一套完整的WEB请求处理流程:从浏览器、Nginx、Servlet容器,最终到应用程序WEB请求的一个处理流程,前段时间由于其他工作事情的安排,一直未进行整理。不过还好该系列终于启动了,给大家分享的同时,也顺便整理下自己的思路,以便温故而知新吧。希望大家都能在此过程中得到新的收获吧。

    本系列主要分五部分:

    1.《WEB请求处理一:浏览器请求发起处理》:分析用户在浏览器中输入URL地址,浏览器如何找到服务器地址的过程,并发起请求;

    2.《WEB请求处理二:Nginx请求反向代理》:分析请求在达反向代理服务器内部处理过程;

    3.《WEB请求处理三:Servlet容器请求处理》:分析请求在Servlet容器内部处理过程,并找到目标应用程序;

    4.《WEB请求处理四:WEB MVC框架请求处理》:分析请求在应用程序内部,开源MVC框架的处理过程;

    5.《WEB请求处理五:浏览器请求响应处理》:分析请求在服务器端处理完成后,浏览器渲染响应页面过程;

    为直观明了,先上一张图,红色部分为本章所述模块:

    本章所述模块

    1 B/S网络架构概述#

    我们先了解下B/S网络架构是什么?B/S网络架构从前端到后端都得到了简化,都基于统一的应用层协议HTTP来交互数据,HTTP协议采用无状态的短链接的通信方式,通常情况下,一次请求就完成了一次数据交互,通常也对应一个业务逻辑,然后这次通信连接就断开了。采用这种方式是为了能够同时服务更多的用户,因为当前互联网应用每天都会处理上亿的用户请求,不可能每个用户访问一次后就一直保持住这个连接

    当一个用户在浏览器里输入www.google.com这个URL时,将会发生如下操作:

    1. 首先,浏览器会请求DNS把这个域名解析成对应的IP地址

    2. 然后,根据这个IP地址在互联网上找到对应的服务器,建立Socket连接,向这个服务器发起一个HTTP Get请求,由这个服务器决定返回默认的数据资源给访问的用户;

    3. 在服务器端实际上还有复杂的业务逻辑:服务器可能有多台,到底指定哪台服务器处理请求,这需要一个负载均衡设备来平均分配所有用户的请求;

    4. 还有请求的数据是存储在分布式缓存里还是一个静态文件中,或是在数据库里

    5. 当数据返回浏览器时,浏览器解析数据发现还有一些静态资源(如:css,js或者图片)时又会发起另外的HTTP请求,而这些请求可能会在CDN上,那么CDN服务器又会处理这个用户的请求;

    以上具体流程,如图所示:

    以上具体流程,如图所示

    不管网络架构如何变化,但是始终有一些固定不变的原则需要遵守:

    1. 互联网上所有资源都要用一个URL来表示。URL就是统一资源定位符;

    2. 必须基于HTTP协议与服务端交互;

    3. 数据展示必须在浏览器中进行;

    2 HTTP协议解析#

    B/S网络架构的核心是HTTP协议,最重要的就是要熟悉HTTP协议中的HTTP Header,HTTP Header控制着互联网上成千上万的用户的数据传输。最关键的是,它控制着用户浏览器的渲染行为和服务器的执行逻辑

    常见的HTTP请求头:

    常见的HTTP请求头

    常见的HTTP响应头:

    常见的HTTP响应头

    常见的HTTP状态码:

    常见的HTTP状态码

    2.1 浏览器缓存机制##

    当我们使用Ctrl+F5组合键刷新一个页面时,首先是在浏览器端,会直接向目标URL发送请求,而不会使用浏览器缓存的数据;其次即使请求发送到服务端,也有可能访问到的是缓存的数据。所以在HTTP的请求头中会增加一些请求头,它告诉服务端我们要获取最新的数据而非缓存。最重要的是在请求Head中增加了两个请求项Pragma:no-cache和Cache-Control:no-cache

    1. Cache-Control/Pragma

    这个HTTP Head字段用于指定所有缓存机制在整个请求/响应链中必须服从的指令,如果知道该页面是否为缓存,不仅可以控制浏览器,还可以控制和HTTP协议相关的缓存或代理服务器

    Cache-Control/Pragma字段的可选值:

    Cache-Control/Pragma字段的可选值

    Cache-Control请求字段被各个浏览器支持的较好,而且它的优先级也比较高,它和其他一些请求字段(如Expires)同时出现时,Cache-Control会覆盖其他字段

    Pragma字段的作用和Cache-Control有点类似,它也是在HTTP头中包含一个特殊的指令,使相关的服务器来遵守,最常用的就是Pragma:no-cache,它和Cache-Control:no-cache的作用是一样的

    1. Expires 缓存过期时间

    Expires通常的使用格式是Expires:Sat,25 Feb 2012 12:22:17 GMT,后面跟着一个日期和时间,超过这个值后,缓存的内容将失效,也就是浏览器在发出请求之前检查这个页面的这个字段,看该页面是否已经过期了,过期了将重新向服务器发起请求

    1. Last-Modified/Etag 最后修改时间

    Last-Modified字段一般用于表示一个服务器上的字段的最后修改时间,资源可以是静态(静态内容自动加上Last-Modified)或者动态的内容(如Servlet提供了一个getLastModified方法用于检查某个动态内容是否已经更新),通过这个最后修改时间可以判断当前请求的资源是否是最新的

    一般服务器端在响应头中返回一个Last-Modified字段,告诉浏览器这个页面的最后修改时间,如:Sat,25 Feb 2012 12:55:04 GMT,浏览器再次请求时在请求头中增加一个If-Modified-Since:Sat,25 Feb 2012 12:55:04 GMT字段,询问当前缓存的页面是否是最新的,如果是最新的就会返回304状态码,告诉浏览器是最新的,服务器也不会传输新的数据。

    与Last-Modified字段有类似功能的还有一个Etag字段,这个字段的作用是让服务端给每个页面分配一个唯一编号,然后通过这个编号来区分当前这个页面是否是最新的。这种方式比使用Last-Modified更加灵活,但是在后端的Web服务器有多台时比较难处理,因为每个Web服务器都要记住网站的所有资源编号,否则浏览器返回这个编号就没有意义了

    3 WEB工作流程#

    对于正常的上网过程,系统其实是这样做的:

    浏览器本身是一个客户端,当你输入URL的时候,首先浏览器会去请求DNS服务器,通过DNS获取相应的域名对应的IP,然后通过IP地址找到IP对应的服务器后,要求建立TCP连接,等浏览器发送完HTTP Request(请求)包后,服务器接收到请求包之后才开始处理请求包,服务器调用自身服务,返回HTTP Response(响应)包;客户端收到来自服务器的响应后开始渲染这个Response包里的主体(body),等收到全部的内容随后断开与该服务器之间的TCP连接。

    Web请求的工作原理

    Web请求的工作原理可以简单地归纳为:

    1. 浏览器通过DNS域名解析到服务器IP

    2. 客户机通过TCP/IP协议建立到服务器的TCP连接

    3. 客户端向服务器发送HTTP协议请求包,请求服务器里的资源文档;

    4. 服务器向客户机发送HTTP协议应答包,如果请求的资源包含有动态语言的内容,那么服务器会调用动态语言的解释引擎负责处理“动态内容”,并将处理得到的数据返回给客户端;

    5. 客户机与服务器断开。由客户端解释HTML文档,在客户端屏幕上渲染图形结果;

    一个简单的HTTP事务就是这样实现的,看起来很复杂,原理其实是挺简单的。需要注意的是客户机与服务器之间的通信是非持久连接的,也就是当服务器发送了应答后就与客户机断开连接,等待下一次请求。

    4 DNS域名解析#

    4.1 DNS域名解析过程##

    当用户在浏览器中输入域名,如:www.google.com,并按下回车后,DNS解析过程大体如下:

    DNS解析过程

    1. 浏览器缓存检查(本机)

    浏览器会首先搜索浏览器自身的DNS缓存(缓存时间比较短,大概只有1分钟,且只能容纳1000条缓存),看自身的缓存中是否有www.google.com对应的条目,而且没有过期,如果有且没有过期则解析到此结束

    浏览器缓存域名也是有限制的,不仅浏览器缓存大小有限制,而且缓存的时间也有限制,通常情况下为几分钟到几小时不等,域名被缓存的时间限制可以通过TTL属性来设置。这个缓存时间太长和太短都不好,如果缓存时间太长,一旦域名被解析到的IP有变化,会导致被客户端缓存的域名无法解析到变化后的IP地址,以致该域名不能正常解析,这段时间内有可能会有一部分用户无法访问网站。如果时间设置太短,会导致用户每次访问网站都要重新解析一次域名。

    注:我们怎么查看Chrome自身的缓存?可以使用 chrome://net-internals/#dns 来进行查看

    查看Chrome自身的DNS缓存

    1. 操作系统缓存检查(本机)+hosts解析(本机)

    如果浏览器自身的缓存里面没有找到对应的条目,其实操作系统也会有一个域名解析的过程,那么Chrome会首先搜索操作系统自身的DNS缓存中是否有这个域名对应的DNS解析结果,如果找到且没有过期则停止搜索解析到此结束

    其次在Linux中可以通过/etc/hosts文件来设置,你可以将任何域名解析到任何能够访问的IP地址。如果你在这里指定了一个域名对应的IP地址,那么浏览器会首先使用这个IP地址。当解析到这个配置文件中的某个域名时,操作系统会在缓存中缓存这个解析结果,缓存的时间同样是受这个域名的失效时间和缓存的空间大小控制的。

    1. 本地区域名服务器解析(LDNS)

    如果在hosts文件中也没有找到对应的条目,浏览器就会发起一个DNS的系统调用,就会向本地配置的首选DNS服务器(LDNS一般是电信运营商提供的,也可以使用像Google提供的DNS服务器)发起域名解析请求(通过的是UDP协议向DNS的53端口发起请求,这个请求是递归的请求,也就是运营商的DNS服务器必须得提供给我们该域名的IP地址)。

    在我们的网络配置中都会有“DNS服务器地址”这一项,这个地址就用于解决前面所说的如果两个过程无法解析时要怎么办,操作系统会把这个域名发送给这里设置的LDNS,也就是本地区的域名服务器这个DNS通常都提供给你本地互联网接入的一个DNS解析服务,例如你是在学校接入互联网,那么你的DNS服务器肯定在你的学校,如果你是在一个小区接入互联网的,那这个DNS就是提供给你接入互联网的应用提供商,即电信或者联通,也就是通常所说的SPA,那么这个DNS通常也会在你所在城市的某个角落,通常不会很远。这个专门的域名解析服务器性能都会很好,它们一般都会缓存域名解析结果,当然缓存时间是受域名的失效时间控制的,一般缓存空间不是影响域名失效的主要因素。大约80%的域名解析都到这里就已经完成了,所以LDNS主要承担了域名的解析工作。

    运营商的DNS服务器首先查找自身的缓存,找到对应的条目,且没有过期,则解析成功。

    运营商的DNS服务器

    1. 根域名服务器解析(Root Server)

    如果LDNS没有找到对应的条目,则由运营商的DNS代我们的浏览器发起迭代DNS解析请求。它首先是会找根域的DNS的IP地址(这个DNS服务器都内置13台根域的DNS的IP地址),找到根域的DNS地址,就会向其发起请求(请问www.google.com这个域名的IP地址是多少啊?)。

    1. 根域名服务器返回给本地域名服务器一个所查询域的主域名服务器(gTLD Server)地址,gTLD是国际顶级域名服务器,如.com、.cn、.org等,全球只有13台左右。

    根域发现这是一个顶级域com域的一个域名,于是就告诉运营商的DNS我不知道这个域名的IP地址,但是我知道com域的IP地址,你去找它去。

    1. 本地域名服务器(Local DNS Server)再向上一步返回的gTLD服务器发送请求

    于是运营商的DNS就得到了com域的IP地址,又向com域的IP地址发起了请求(请问www.google.com这个域名的IP地址是多少?),com域这台服务器告诉运营商的DNS我不知道www.google.com这个域名的IP地址,但是我知道google.com这个域的DNS地址,你去找它去。

    1. 接受请求的gTLD服务器查找并返回此域名对应的Name Server域名服务器的地址,这个Name Server通常就是你注册的域名服务器,例如你在某个域名服务提供商申请的域名,那么这个域名解析任务就由这个域名提供商的服务器来完成。

    于是运营商的DNS又向google.com这个域名的DNS地址(这个一般就是由域名注册商提供的,像万网,新网等)发起请求(请问www.google.com这个域名的IP地址是多少?),这个时候google.com域的DNS服务器一查,果真在我这里,于是就把找到的结果发送给运营商的DNS服务器,这个时候运营商的DNS服务器就拿到了www.google.com这个域名对应的IP地址

    1. Name Server域名服务器会查询存储的域名和IP的映射关系表,正常情况下都根据域名得到目标IP记录,连同一个TTL值返回给DNS Server域名服务器。

    2. 返回该域名对应的IP和TTL值,Local DNS Server会缓存这个域名和IP的对应关系,缓存的时间由TTL值控制。

    3. 把解析的结果返回给用户,用户根据TTL值缓存在本地系统缓存中,域名解析过程结束

    通过上面的步骤,我们最后获取的是IP地址,也就是浏览器最后发起请求的时候是基于IP来和服务器做信息交互的。在实际的DNS解析过程中,可能还不止这10个步骤,如Name Server也可能有多级,或者有一个GTM来负载均衡控制,这都有可能会影响域名解析的过程。根据以上解析流程,DNS解析整个过程,分为:递归查询过程和迭代查询过程。如图所示:

    DNS解析整个过程

    所谓 递归查询过程 就是 “查询的递交者” 更替, 而 迭代查询过程 则是 “查询的递交者”不变。

    举个例子来说,你想知道某个一起上法律课的女孩的电话,并且你偷偷拍了她的照片,回到寝室告诉一个很仗义的哥们儿,这个哥们儿二话没说,拍着胸脯告诉你,甭急,我替你查(此处完成了一次递归查询,即,问询者的角色更替)。然后他拿着照片问了学院大四学长,学长告诉他,这姑娘是xx系的;然后这哥们儿马不停蹄又问了xx系的办公室主任助理同学,助理同学说是xx系yy班的,然后很仗义的哥们儿去xx系yy班的班长那里取到了该女孩儿电话。(此处完成若干次迭代查询,即,问询者角色不变,但反复更替问询对象)最后,他把号码交到了你手里。完成整个查询过程。

    4.2 跟踪域名解析过程##

    在Linux系统中还可以使用dig命名来查询DNS的解析过程,如下所示:dig +cmd +trace www.google.com

    使用dig命名来查询DNS的解析过程

    上面清楚地显示了整个域名是如何发起和解析的,从根域名(.)到gTLD Server(.com.)再到Name Server (google.com.)的整个过程都显示出来了。还可以看出DNS的服务器有多个备份,可以从任何一台查询到解析结果。

    4.3 清除缓存的域名##

    我们知道DNS域名解析后会缓存解析结果,其中主要在两个地方缓存结果,一个是Local DNS Server,另外一个是用户的本地机器。这两个缓存都是TTL值和本机缓存大小控制的,但是最大缓存时间是TTL值,基本上Local DNS Server的缓存时间就是TTL控制的,很难人工介入,但是我们的本机缓存可以通过如下方式清除。

    在Linux下可以通过/etc/init.d/nscd restart来清除DNS缓存。如下:

    在Linux下清除DNS缓存

    JVM缓存DNS解析结果:

    在Java应用中JVM也会缓存DNS的解析结果,这个缓存是在InetAddress类中完成的,而且这个缓存时间还比较特殊,它有两种缓存策略:一种是正确解析结果缓存,另一种是失败的解析结果缓存。这两个缓存时间由两个配置项控制,配置项是在%JAVA_ HOME%\lib\security\java.security文件中配置的。两个配置项分别是networkaddress.cache.ttl 和networkaddress.cache.negative.ttl,它们的默认值分别是-1(永不失效)和10(缓存10秒)

    要修改这两个值同样有几种方式,分别是:直接修改java.security文件中的默认值、在Java的启动参数中增加-Dsun.net.inetaddr.ttl=xxx来修改默认值、通过InetAddress类动态修改。

    在这里还要特别强调一下,如果我们需要用InetAddress类解析域名时,一定要是单例模式,不然会有严重的性能问题,如果每次都创建InetAddress实例,每次都要进行一次完整的域名解析,非常耗时,这点要特别注意。

    4.4 几种域名解析方式##

    1. A记录,A代表的是Address,用来指定域名对应的IP地址

    如将item.taobao.com指定到115.238.23.241,将switch.taobao.com指定到121.14.24.241。A记录可以将多个域名解析到一个IP地址,但是不能将一个域名解析到多个IP地址

    1. MX记录,表示的是Mail Exchange,就是可以将某个域名下的邮件服务器指向自己的Mail Server

    taobao.com域名的A记录IP地址是115.238.25.245,如果MX记录设置为115.238.25.246,是xxx@taobao.com的邮件路由,DNS会将邮件发送到115.238.25.246所在的服务器,而正常通过Web请求的话仍然解析到A记录的IP地址

    1. CNAME记录,全称是Canonical Name(别名解析),所谓的别名解析就是可以为一个域名设置一个或者多个别名

    如将taobao.com解析到xulingbo.net,将srcfan.com也解析到xulingbo.net,其中xulingbo.net分别是taobao.com和srcfan.com的别名。前面的跟踪域名解析中的“www.taobao.com. 1542 IN CNAME www.gslb.taobao.com”就是CNAME解析。

    1. NS记录,为某个域名指定DNS解析服务器,也就是这个域名有指定的IP地址的DNS服务器去解析

    前面的“google.com. 172800 IN NS ns4.google.com.”就是NS解析。

    1. TXT记录,为某个主机名或域名设置说明

    如可以为google.com设置TXT记录为“谷歌|中国”这样的说明。

    4.5 网络抓包分析##

    Linux虚拟机测试,使用命令 wget www.linux178.com 来请求,发现直接使用chrome浏览器请求时,干扰请求比较多,所以就使用wget命令来请求,不过使用wget命令只能把index.html请求回来,并不会对index.html中包含的静态资源(js、css等文件)进行请求

    抓包截图如下:

    抓包截图

    1号包,这个是那台虚拟机在广播,要获取192.168.100.254(也就是网关)的MAC地址,因为局域网的通信靠的是MAC地址,它为什么需要跟网关进行通信是因为我们的DNS服务器IP是外围IP,要出去必须要依靠网关帮我们出去才行

    2号包,这个是网关收到了虚拟机的广播之后,回应给虚拟机的回应,告诉虚拟机自己的MAC地址,于是客户端找到了路由出口。

    3号包,这个包是wget命令向系统配置的DNS服务器提出域名解析请求(准确的说应该是wget发起了一个DNS解析的系统调用),请求的域名www.linux178.com期望得到的是IP6的地址(AAAA代表的是IPv6地址)

    4号包,这个DNS服务器给系统的响应,很显然目前使用IPv6的还是极少数,所以得不到AAAA记录的。

    5&6号包,这个还是请求解析IPv6地址,但是www.linux178.com.leo.com这个主机名是不存在的,所以得到结果就是no such name。

    7号包,这个才是请求的域名对应的IPv4地址(A记录)。

    8号包,DNS服务器不管是从缓存里面,还是进行迭代查询最终得到了域名的IP地址,响应给了系统,系统再给了wget命令,wget于是得到了www.linux178.com的IP地址,这里也可以看出客户端和本地的DNS服务器是递归的查询(也就是服务器必须给客户端一个结果)这就可以开始下一步了,进行TCP的三次握手。

    5 发起TCP的3次握手#

    拿到域名对应的IP地址之后,User-Agent(一般是指浏览器)会以一个随机端口(1024 < 端口 < 65535)向服务器的WEB程序(常用的有httpd,nginx等)80端口发起TCP的连接请求。这个连接请求(原始的http请求经过TCP/IP4层模型的层层封包)到达服务器端后(这中间通过各种路由设备,局域网内除外),进入到网卡,然后是进入到内核的TCP/IP协议栈(用于识别该连接请求,解封包,一层一层的剥开),还有可能要经过Netfilter防火墙(属于内核的模块)的过滤,最终到达WEB程序,最终建立了TCP/IP的连接。

    如下图所示:

    03174517_saG0.png

    1. Client首先发送一个连接试探,ACK=0 表示确认号无效,SYN = 1 表示这是一个连接请求或连接接受报文,同时表示这个数据报不能携带数据,seq = x 表示Client自己的初始序号(seq = 0 就代表这是第0号包),这时候Client进入syn_sent状态,表示客户端等待服务器的回复。

    2. Server监听到连接请求报文后,如同意建立连接,则向Client发送确认。TCP报文首部中的SYN 和 ACK都置1 ,ack = x + 1表示期望收到对方下一个报文段的第一个数据字节序号是x+1,同时表明x为止的所有数据都已正确收到(ack=1其实是ack=0+1,也就是期望客户端的第1个包),seq = y 表示Server自己的初始序号(seq=0就代表这是服务器这边发出的第0号包)。这时服务器进入syn_rcvd,表示服务器已经收到Client的连接请求,等待client的确认。

    3. Client收到确认后还需再次发送确认,同时携带要发送给Server的数据。ACK 置1 表示确认号ack= y + 1 有效(代表期望收到服务器的第1个包),Client自己的序号seq= x + 1(表示这就是我的第1个包,相对于第0个包来说的),一旦收到Client的确认之后,这个TCP连接就进入Established状态,就可以发起http请求了。

    看抓包截图:

    抓包截图

    TCP 为什么需要3次握手?

    举个例子:假设一个老外在故宫里面迷路了,看到了小明,于是就有下面的对话:

    老外: Excuse me,Can you Speak English?

    小明: yes 。

    老外: OK,I want ...

    在问路之前,老外先问小明是否会说英语,小明回答是的,这时老外才开始问路。

    2个计算机通信是靠协议(目前流行的TCP/IP协议)来实现,如果2个计算机使用的协议不一样,那是不能进行通信的,所以这个3次握手就相当于试探一下对方是否遵循TCP/IP协议,协商完成后就可以进行通信了,当然这样理解不是那么准确。

    为什么HTTP协议要基于TCP来实现?

    目前在Internet中所有的传输都是通过TCP/IP进行的,HTTP协议作为TCP/IP模型中应用层的协议也不例外,TCP是一个端到端的可靠的面向连接的协议,所以HTTP基于传输层TCP协议不用担心数据的传输的各种问题。

    6 建立TCP连接后发起http请求#

    经过TCP3次握手之后,浏览器发起了http的请求(看第⑫包),使用的http的方法 GET 方法,请求的URL是 / ,协议是HTTP/1.0:

    03175340_4j8z.png

    下面是第12号包的详细内容:

    03175429_kHoP.png

    以上的报文是HTTP请求报文。那么HTTP请求报文和响应报文会是什么格式呢?

    起始行:如 GET / HTTP/1.0 (请求的方法 请求的URL 请求所使用的协议)

    头部信息:User-Agent Host等成对出现的值

    主体

    不管是请求报文还是响应报文都会遵循以上的格式。那么起始行中的请求方法有哪些种呢?

    GET: 完整请求一个资源 (常用)

    HEAD: 仅请求响应首部

    POST: 提交表单 (常用)

    PUT: 上传

    DELETE: 删除

    OPTIONS: 返回请求的资源所支持的方法的方法

    TRACE: 追求一个资源请求中间所经过的代理

    那什么是URL、URI、URN?

    URI Uniform Resource Identifier 统一资源标识符,如:scheme://[username:password@]HOST:port/path/to/source

    URL Uniform Resource Locator 统一资源定位符,如:http://www.magedu.com/downloads/nginx-1.5.tar.gz

    URN Uniform Resource Name 统一资源名称

    URL和URN都属于URI,为了方便就把URL和URI暂时都通指一个东西。

    请求的协议有哪些种?有以下几种:

    http/0.9: stateless

    http/1.0: MIME, keep-alive (保持连接), 缓存

    http/1.1: 更多的请求方法,更精细的缓存控制,持久连接(persistent connection) 比较常用

    下面是Chrome发起的http请求报文头部信息:

    03181252_cIE1.png

    Accept 就是告诉服务器端,接受那些MIME类型

    Accept-Encoding 这个看起来是接受那些压缩方式的文件

    Accept-Lanague 告诉服务器能够发送哪些语言

    Connection 告诉服务器支持keep-alive特性,TCP连接在发送后将仍然保持打开状态,于是,浏览器可以继续通过相同的TCP连接发送请求。保持连接节省了为每个请求建立新连接所需的时间,还节约了网络带宽。

    Cookie 每次请求时都会携带上Cookie以方便服务器端识别是否是同一个客户端

    Host 用来标识请求服务器上的那个虚拟主机,比如Nginx里面可以定义很多个虚拟主机,那这里就是用来标识要访问那个虚拟主机。

    User-Agent 用户代理,一般情况是浏览器,也有其他类型,如:wget curl 搜索引擎的蜘蛛等

    条件请求头部:If-Modified-Since是浏览器向服务器端询问某个资源文件如果自从什么时间修改过,那么重新发给我,这样就保证服务器端资源文件更新时,浏览器再次去请求,而不是使用缓存中的文件。

    安全请求头部:Authorization: 客户端提供给服务器的认证信息;

    什么是MIME?

    MIME(Multipurpose Internet Mail Extesions 多用途互联网邮件扩展)是一个互联网标准,它扩展了电子邮件标准,使其能够支持非ASCII字符、二进制格式附件等多种格式的邮件消息,这个标准被定义在RFC 2045、RFC 2046、RFC 2047、RFC 2048、RFC 2049等RFC中。 由RFC 822转变而来的RFC 2822,规定电子邮件标准并不允许在邮件消息中使用7位ASCII字符集以外的字符。正因如此,一些非英语字符消息和二进制文件,图像,声音等非文字消息都不能在电子邮件中传输。

    MIME规定了用于表示各种各样的数据类型的符号化方法。此外,在万维网中使用的HTTP协议中也使用了MIME的框架,标准被扩展为互联网媒体类型。

    MIME 遵循以下格式:major/minor 主类型/次类型 例如:

    image/jpg

    image/gif

    text/html

    video/quicktime

    appliation/x-httpd-php



    转自:https://www.jianshu.com/p/558455228c43
     

    展开全文
  • python抓取数据时候经常需要携带请求头之类参数, 看到同事都是google浏览器中复制粘贴,然后 手动一行一行转变成字典格式,以便符合携带格式。 太繁琐,效率太低。 这种东西就应该工具化,直接上代码: #...

    python抓取数据时候经常需要携带请求头之类参数,

    看到同事都是google浏览器中复制粘贴,然后

    手动一行一行转变成字典格式,以便符合携带格式。

    太繁琐,效率太低。

    这种东西就应该工具化,直接上代码:

    #coding:utf-8
    with open("请求头.txt")as f:
        res = f.readlines()
    headers ={}
    for r in res:
        headers[r.split(": ")[0]]=r.split(": ")[1].replace("\n","")
    print(headers)

    把google浏览器复制的请求参数,直接放到请求头文本文件中。

    执行代码即可自动变成字典格式,复制一下即可。方便快捷。

    另外自己写了小工具,

    c#版本----文件非常小20kb

    csdn : https://download.csdn.net/download/m0_38124502/10769324

    网盘 :链接:https://pan.baidu.com/s/1XRz0NgEOHkAdLOMpg6Uwdg 
    提取码:52r4 
     

    pyqt版本-----文件大32.4mb

    csdn : https://download.csdn.net/download/m0_38124502/10769331

    网盘 : 链接:https://pan.baidu.com/s/1DUgVf6xjQfv78Qr0c9YVwg 
    提取码:k520 
    ---------------------------------------

    c#截图

     

    pyqt版本

    请求头,响应头,form表单放进去 , 执行就好。

    欢迎进(Q)群,帮你解决问题:

     

    展开全文
  • 你该知道的浏览器请求与Header

    千次阅读 多人点赞 2021-05-14 23:23:13
    从url到页面展示过程中发生了什么 让我们从一道“经典前端面试题” —— 从url到页面展示...url 编码是以 utf-8 为标准,但不是所有浏览器对所有情况都是这样。像JS的话就有 encodeURIComponent 和 encodeURI 来保证以

    从url到页面展示过程中发生了什么

    让我们从一道“经典前端面试题” —— 从url到页面展示过程中发生了什么说起:

    1. url解析,根据dns系统进行ip查找;

    ① 网络标准规定了 url 只能是数字和字母,还有一小些特殊符号。url 可以携带参数。如果不对 url 转义可能会出现歧义。比如 ?key=value 中可能key本身就包括=符号;
    url 编码是以 utf-8 为标准,但不是所有浏览器对所有情况都是这样。像JS的话就有 encodeURIComponentencodeURI 来保证以 utf-8 编码。
    ② dns解析流程是 hosts(映射ip) -> 本地dns解析器(缓存) -> 计算机上配置的dns服务器 -> 全球根dns服务器
    前端的dns优化就是在 head 里添加:<meta http-equiv="x-dns-prefetch-control" content="on" /><link rel="dns-prefetch" href="xxx" />

    1. 查找到 ip 之后,进行 TCP 三次握手发送http请求;
    2. 建立完链接,请求HTML文件/资源,如果在缓存中有就直接拿,否则向后端要;

    浏览器首次加载资源成功时,服务器返回200,此时浏览器不仅把资源下载了,而且把 response 的 header 一并缓存;
    下一次加载资源时,首先会经过强缓存处理,cache-control 优先级最高,比如 cache-control:no-cache 就直接进入协商缓存步骤;如果是 max-age=xxx,就会先比较当前时间和上一次返回200时的时间差(比较date属性),如果没超过max-age,命中强缓存,不发请求直接从本地缓存中读取该文件(这里注意:如果无 cache-control 字段,会去比较 expires),过期的话就进入下一阶段:协商缓存;
    协商缓存阶段会比较两个字段:If-Modified-SinceIf-None-Match,他们会在 header 中跟随请求到达服务端。首先会比较If-None-Match- Etag,如果相同则命中协商缓存,返回304;如果不一致返回新资源 & 200.然后是 If-Modified-Since -last-modified(跟服务端获取的文件最近改动的时间比较),如果一致命中协商缓存,返回304;否则返回新的 last-modified 值和文件以及200;

    1. 服务器处理完会返回HTML;
    2. TCP 四次挥手结束请求;
    3. 浏览器解析HTML,有“构建 DOM 树”->“构建 CSSOM 树”->“执行JS”->“根据 DOM 和 CSSOM 合并生成 render 树”->“渲染”->“布局”->“绘制”

    一次完整的请求正式结束。其实这和 img 的 src、script 的 src 一样,可以看做一次get请求!


    请求与响应中的Header

    上面缓存那里提到了一些头字段,我们来看一下:

    header

    可以看到,一次请求包括“请求”和“响应”两个部分。他们具体是:

    • 请求行
    • 请求头
    • 请求体
    • 状态行(响应)
    • 响应头(响应)
    • 响应正文(响应)

    响应头

    其中“请求头”和“响应头”使我们比较关注的。先来看响应头 —— 他们都是由服务端控制的,用来实现不同的功能。比较常见的有:

    • etag:资源唯一标识
    • last-modified:请求资源的最后修改时间
    • cache-control
    • expires
    • Date
    • Access-Control-Allow系
    • Set-Cookie: 服务端设置管理状态所用的cookie信息(这里面也有expires指令,它仅控制cookie的存活时间,如果不指定则默认到浏览器关闭)(在里面还可以通过 Secure 和 HttpOnly 来进行web安全防御)

    先说 Access-Control-Allow系,他们是用来跨域和设置服务端允许接收什么形式的请求;
    bilibili设置的allow

    然后是 Date:服务端消息发出的时间。它的值应该是上一次请求为200时的时间,用来在下一次请求强缓存阶段和 max-age 属性做比较,它是一个 GMT 时间;
    然后是 expires:它是一个绝对时间,规定了缓存在什么时间后过期。因为绝对时间对应用场景的限制,才出现了 max-age :相对时间(相对资源上一次被请求的时间);

    最重要的便是这个 cache-control 了。它包含几个值:

    • public:表明响应可以被任何对象缓存;
    • private:响应只能被客户端缓存;
    • no-store:表示当前请求资源不准被缓存;
    • no-cache:资源有缓存,但必须向服务端发一次请求(跳过强缓存,直接进入协商缓存,比较 Etag 和 last-modified)
    • max-age
    • s-maxage

    几个经典问题

    1、这里 no-storeno-cache 引起了我的注意:他们有什么用呢?真的如定义所说么?
    经过验证,对于 no-store 来说,正如它定义的那样,资源不会被以任何形式的缓存,在下一次请求时依然会被服务器认为是“第一次请求”;而对于 no-cache来说,它更偏重比较两次资源有没有变化,它和 max-age=0 表现一致,在下一次请求时,虽然浏览器缓存中有,但仍然向服务端发一次请求确认(会携带Etag),如果资源没有变化,返回304(只返回)表示资源还可以继续使用,浏览器才会从缓存中拿到资源;否则按照新的请求返回并重新缓存。

    2、为什么 no-cache 优先级比 no-store 高?
    这个问题笔者翻遍资料也没找到,但是根据上面的描述我可以猜测:是因为确保文件的时效性的同时兼顾性能。如果请求发现文件并没有改动,这时候实际上也并不需要重新传输资源并拿到页面上,直接从缓存中取的话更快一些。

    3、为什么cache-control(有指定 max-age 时)的优先级比expires高?
    原因在于Expires控制缓存的原理是使用客户端的时间与服务端返回的时间做对比,那么如果客户端与服务端的时间因为某些原因(例如时区不同;客户端和服务端有一方的时间不准确)发生误差,那么强制缓存则会直接失效,这样的话强制缓存的存在则毫无意义;而且前面说了,expires控制的绝对时间,也就是说你指定的是哪一年几月几日几时几分几秒,大多数场景下这样非常不方便。

    哦对了,上面不断提到了协商缓存阶段用到的几个头字段 EtagIf-None-Matchlast-modifiedIf-Modified-Since,前面说会首先比较Etag,那为什么 Etag 优先级要更高一些呢?

    • 首先,If-Modified-Since 只能检查秒级别的时间(或者说 Unix 记录 MTIME 只能精确到秒),对于文件修改非常频繁的情况,它就无能为力了。
    • 其次,last-modified 日期并不可靠。有时开发人员会在修复某些内容后将所有文件上传到服务器,即使内容仅在子集上修改,也会重置所有文件的 last-modified 日期。
    • 而 Etag 不一样,它是由开发者生成的对应资源在服务端的唯一标识,它本质上是使用像 SHA256 这样的散列函数生成的一段 hash值。

    请求头

    http请求中的“请求头”同样优秀,这里列举一些常见的:

    • Accept系:客户端可接受的一些编码、内容类型等方面的设置
    • Cache-Control:本资源的缓存机制
    • Connection:是否需要长久连接(http1.1默认开启)
    • cookie:发送请求时,会把保存在该请求域名下的所有cookie一起发送过去
    • content系:请求的信息,比如:请求体的字节长度(请求体是指在HTTP头结束后,两个CR-LF字符组之后的内容,常见的有POST提交的表单数据,并不包含请求行和HTTP头的数据长度)、是否基于MD5算法对请求体内容进行Base64二进制编码、设置请求体中的内容的 mime 类型(适用于post和put请求)
    • Date:发送请求的日期
    • Origin:发送请求的资源的“协议名+域名”
    • referer(referrer):发送请求的资源的地址
    • Upgrade:传输协议(学过websocket的应该不怎么陌生)
    • User-agent:用户信息
    • If-None-Match:值为服务器先前响应的Etag,用来比较判断是否资源发生了改变
    • If-Modified-Since:请求资源是否在指定时间后才被修改

    这里发现:请求头中有 cache-control 字段,而响应头中也有这个字段!他们是怎么发挥作用的?
    事实上,它们之间的关系是:响应头(后端设置的)中控制缓存的开启,而请求头(前端ajax设置)可控制不缓存。 我们用 node做服务器来看一下:

    // 前端代码
    const ajax=new XMLHttpRequest();
    ajax.open('get','http://localhost:8083/assets');
    // ajax.setRequestHeader('cache-control','max-age=0');
    ajax.onreadystatechange=function(){
    	if(ajax.readyState==4 && ajax.status==200){
    		console.log(ajax.responseText);
    	}
    }
    ajax.send()
    

    这段代码中有一行注释,打开则表示前端设置不进行缓存,如果打开,则请求时的请求头与响应头是这样的(此时每次请求都不会再走强缓存,而是直接向服务端发送请求):
    header1

    但若关闭注释,表示一切以后端设置的为主。(这种情况 Request Header 里面是没有 cache-control 这个字段的)

    // koa代码
    const Koa=require("koa");
    const Router=require("koa-router");
    const cors=require('koa2-cors');
    //引入静态服务模块
    const staticFiles = require('koa-static');
    const router=new Router();
    
    const app=new Koa();
    
    app.use(cors({
    	origin:'*',
    	credentials:true   // koa中控制允许接收cookie的方式
    }))
    
    
    app.use(staticFiles(__dirname + '/试验的HTML页面都在这'))
    app.use(async(ctx,next)=>{
    	console.log('这是全局测试',Date.now())
    	await next()
    })
    
    router.get('/assets',async (ctx,next)=>{
    	console.log(ctx);
    	ctx.set('cache-control', 'max-age=30');
    	ctx.body='这是一次test'
    })
    
    app.use(router.routes())
    app.use(router.allowedMethods())
    
    app.listen(8083);
    

    我们可以看下这时候的效果:
    test-show

    请求头中还有两个字段是需要重点提到的:
    首先是cookie —— 可能前端都听过“cookie会被自动携带到 header 中发送到服务端”。有时候我们也会配合后端使用token(JWT)。这里涉及到“简单请求”和“非简单请求”的概念:

    • 简单请求:请求方法是GET、POST、HEAD之一,且HTTP头信息只有/少于“Accept”、“Accept-Language”、“Content-Language”、“Last-Event-ID”、“Content-Type”,并且Cnotent-Type的值仅限于“application/x-www-form-urlencoded”、“multipart/form-data”、“text/plain”;
    • 非简单请求:对服务器有特殊要求,比如请求方式是PUT、DELETE,或者Content-Type字段类型是application/json,或者HTTP头信息中加了自定义header(比如token);

    他们通常发生在“跨域请求”中的 cors 场景中(这属于Ajax请求的范畴,也是浏览器请求的一种,故而放到本文)。
    其次是 origin ——它也和跨域密切相关,我们一起聊聊。


    跨域的解决

    说起跨域,简单来说就是浏览器对两个不同源的资源之间资源共享的限制。前端js对跨域的解决方法有很多,这里说下最主要的两种:cors和jsonp。

    cors原理

    对于简单请求,浏览器直接发出CORS请求。具体来说,就是在请求头信息中增加一个 origin 字段(这是浏览器自动添加的)。如果 origin 指定的源不在许可范围内,服务端会返回一个正常的HTTP响应。浏览器发现响应头信息中没有包含 Access-Control-Allow-Origin字段,就知道出错了,从而抛出一个错误,这个错误被XMLHttpRequest的 onerror 回调捕获。

    注意:这种情况下无法通过状态码识别,因为HTTP回应的状态码有可能也是200。

    怎么判断origin指定的源在不在许可范围内?这就是cors解决跨域的方法:后端配置一些响应头,在里面指定域名、请求方法等信息:

    // springMVC 代码
    @Configuration
    public class CrosConfig implements WebMvcConfigurer {
        @Override
        public void addCorsMappings(CorsRegistry registry) {
            registry.addMapping("/**")
                    .allowedOrigins("*")
                    .allowedMethods("*")
                    .allowedHeaders("*");
        }
    }
    

    简单请求中要让浏览器携带cookie必须手动在ajax中设置:

    xhr.withCredentials=true;
    

    同时要让服务端同意(接受),通过指定 Access-Control-Expose-Credentials 字段。

    对于非简单请求的跨域cors,浏览器会首先发出类型为 OPTIONS 的“预检请求”,请求地址相同,浏览器询问服务端当前网页所在域名是否在服务端的许可名单中,服务端对“预检请求”处理,并对 Response Header 添加验证字段,客户端接收到预检请求的返回值进行一次请求预判断,验证通过后主请求发起。这种情况浏览器只有在第一次请求后得到肯定答复时才发出主请求,否则会直接报错

    非简单请求在服务端的配置和简单请求差不多,唯一不同的是:Allow-Origin字段必须是确定的(不能是“ * ”)!

    关于这点,有的说可以有的说不行。笔者在项目中测试时不行的,也可能和项目的其他某些配置有关。

    jsonp

    jsonp的原理是利用了像script、img这类标签的src属性并不被同源策略约束的特性。它是动态生成script标签的方式。jsonp只允许get请求!

    jsonp的实现模式是callback。也就是说,我们必须要接收一个回调函数去拿到返回值:

    <!DOCTYPE html>
    <html lang="en">
      <head>
        <meta charset="utf-8">
      </head>
      <body>
        <script type='text/javascript'>
          // 后端返回直接执行的方法,相当于执行这个方法,由于后端把返回的数据放在方法的参数里,所以这里能拿到res。
          window.showLocation = function (res) {
            console.log(res)
            //执行ajax回调
          }
        </script>
        <script src='http://127.0.0.1:8080?callback=showLocation' type='text/javascript'></script>
      </body>
    </html>
    

    和这段代码表述的意思相同,jsonp的原理就是:创建一个回调函数,然后在远程服务上调用这个函数并且将JSON数据作为参数传递,完成回调(它的本质是在服务端以结果为参数调用传递过去的函数名,并且将这一切返回给前端,这样就相当于在js中直接执行了函数)。

    // node.js服务端代码
    const http = require("http");
    const server = http.createServer();
    
    server.on("request", (req, res) => {
        res.setHeader("Content-Type", "text/html;charset=utf-8");
        res.end("showLocation('我是返回值')");   // !这里当心
    });
    
    server.listen(8080, () => {
        console.log("请访问  http://127.0.0.1:8080");
    });
    

    为什么jsonp要以这种方式?

    一般情况下,我们希望这个 script 标签能够动态调用,而不是固定在HTML中所以没等页面显示完就执行了,很不灵活。我们可以通过js动态创建 script 标签,然后以回调函数名作为参数传递,回调函数的参数又是服务端调用这个参数后传递进去的结果。这样就可以灵活调用远程服务了。

    jsonp的不足?

    JSONP 的优势就在于简单易用、能够直接访问响应文本、支持在浏览器与服务器之间双向通信,也就是说,包含 JSON 编码数据的响应体会自动解码(即执行)。
    但这也说明JSONP“ 依赖 ”其他域中的代码。如果其他域不安全,很肯能会在响应中夹带一些恶意代码,此时除了放弃 jsonp 调用之外没有任何办法;
    其次,要确定 JSONP 请求是否失败并不容易。虽然 HTML5 给 script 元素增加了 onerror 事件,但目前支持情况不是很好。为此你必须使用计时器检测指定时间内是否接收到响应。

    展开全文
  • Fiddler拦截Chrome浏览器请求设置

    千次阅读 2015-08-22 23:42:34
    Fiddler拦截Chrome浏览器请求设置
  • Charles抓包,修改接口请求参数
  • https://www.jianshu.com/p/558455228c43最近,终于要把《WEB请求处理系列》提上日程了,一直答应小伙伴们给分享一套完整的WEB请求处理流程:从浏览器、Nginx、Servlet容器,最终到应用程序WEB请求的一个处理流程,...
  • HTTP协议详解及Java模拟浏览器请求

    千次阅读 2018-09-19 18:07:10
    HTTP(Hypertext transfer protocol)超文本传输协议,通过浏览器和服务器进行数据交互,进行超文本(文本、图片、视频等)传输的规定。也就是说,HTTP协议规定了超文本传输所要遵守的规则。 HTTP是一个应用层协议,...
  • 最近要写一款基于被动式的漏洞扫描器,因为被动式是将我们在浏览器浏览的时候所发出的请求进行捕获,然后交给扫描器进行处理,本来打算自己写这个代理的,但是因为考虑到需要抓取https,所以最后找到Mitmproxy这个...
  • Charles修改请求参数响应参数 1、Charles简介 Charles是一种网络封包截取工具,它可将自己设置成系统的网络代理服务器,使所有的请求都通过其来完成,从而实现封包截取功能 2、修改 “请求/响应” 数据 (1)截取...
  • **浏览器发送请求三要素: 第一要素: ... 控制浏览器发送请求携带请求参数 第一要素:控制浏览器发送请求地址 1 超链接标签命令: 利用超链接发送请求 格式: <a href="请求地址">提示信息<
  • 域名解析 -->发起TCP的3次握手 -->建立TCP连接后发起http请求 -->服务器响应http请求浏览器得到html代码 -->浏览器解析html代码,并请求html代码中的资源(如js、css、图片等) -->浏览器对页面进行渲染呈现给用户
  • 服务器响应http请求浏览器得到html代码 浏览器解析html代码,并请求html代码中的资源(如js、css、图片) 浏览器对页面进行渲染呈现给用户以下就是上面过程的一一分析,我们就以Chrome浏览器为例
  • post请求参数过长浏览器报400错误

    千次阅读 2017-11-21 17:20:02
    修改方法: url = "${ctx}/roleController.do?updateAuthority"; $.post(url,{rolefunctions:node,roleId:roleId},function(result){   if(result.success == true){   hint(result.msg,1,0)
  •  对于B/S的软件,数据的传递体现在,用户利用浏览器请求,以获得服务器响应。在JavaWeb项目中,大致包含.java文件的数据处理模块,和在浏览器展示的.jsp,.html信息展示模块。这里还要区分前台和后台两个概念,前台...
  • WEB请求处理一:浏览器请求发起处理 最近,终于要把《WEB请求处理系列》提上日程了,一直答应小伙伴们给分享一套完整的WEB请求处理流程:从浏览器、Nginx、Servlet容器,最终到应用程序WEB请求的一个处理流程,前...
  • GET请求方式:1)请求参数数量不能超过4K 2)请求参数信息会在地址栏上展示出来 3)请求参数要保存在请求头中 4)资源文件会在浏览器中缓存 POST请求方式:1)请求参数数量不限 2)请求参数信息不会在地址...
  • 1.《WEB请求处理一:浏览器请求发起处理》:分析用户在浏览器中输入URL地址,浏览器如何找到服务器地址的过程,并发起请求; 2.《WEB请求处理二:Nginx请求反向代理》:分析请求在达反向代理服务器内部处理过程...
  • 浏览器请求发送时需要控制的行为: 1.浏览器发送请求地址2.浏览器选择的请求方式3.浏览器发送请求时携带的请求参数二。如何浏览器发送请求地址 1.超链接标签命令:1) 命令格式: 提示信息 2) 命令作用:当用户使用鼠标...
  • 这是一道比较经典的面试题,主要考察的是对网络方面的认识。 先通过一张图对整个处理流程进行描述(出自参考资料1):...请求包在服务器端经过负载均衡,到达服务器,经服务器处理后返回结果给客户端,客户端收到结...
  • 浏览器发送请求过程解析

    千次阅读 2019-05-21 11:17:11
    当用户在浏览器的地址栏中输入一个URL并按回车键之后,浏览器会向HTTP服务器发送HTTP请求。HTTP请求主要分为“Get”和“Post”两种方法。 2.采取“Get”方法的HTTP请求 “Get”请求的典型用途是从HTTP服务器获取...
  • 1.接口处右击鼠标 勾选breakpoints(允许本接口使用breakpionts功能) 2.设置断点值 3.从新刷新浏览器,可修改请求参数,执行请求 4.执行成功
  • Fildder拦截请求并修改请求参数

    千次阅读 2019-04-18 18:38:42
    其中pageid是请求参数,输入命令后回车即可,新的请求设置成功,除非释放请求,否则请求值不变,释放请求命令urlreplace 2)脚本中修改规则,打开脚本方式:fiddler执行Rules->Customize Rules 示例一:拦截考拉...
  • 浏览器默认请求方式设置

    千次阅读 2018-08-28 12:49:00
    1.浏览器默认方式form-...后面设置请求参数 app.use(function(req, res, next){ //设置跨域访问 res.header('Access-Control-Allow-Origin', '*'); res.header('Access-Control-Allow-Headers', 'Content-Type, Con...
  • chrome浏览器get请求设置header

    千次阅读 2020-11-20 09:27:59
    有时在测试后端接口时可能会用到get请求,比如下载文件接口之类的, 但是浏览器在url栏中输入url地址后却没有输入header的地方, 在使用chrome浏览器时就可以借助chrome的插件来达到这一目的,在 chrome 网上...
  • 1. 查询加参数了,依赖前端写完界面测试?或者维护postman之类的工具,有点难受。 2. 有些值依赖前一个请求,比如查看列表,然后查看详情,用postman费劲。 3. 产品或者测试压根不熟悉postman 4. ...
  • base64_encode 编码后的字符串中含有 ...一次请求经过默认base64编码后为: url:http://localhost/pre?merchantNo=222222&cipherJson=FZbDffV4jzH8SHFl8bakEJGyZLYrQdEM0F4CU3tiEcS7s6SyCIFa3cDU5fJAiZnTxjURePnMJ5wcq
  • 急急急!...循环由浏览器发起10000个请求,如何拦截请求的URL并把URL中的一个参数的值保存起来(因为每次请求参数都会由浏览器的ocx控件生成不一样的值)。知道的高手麻烦留下联系方式,谢谢了!...
  • 目录 应用场景: 操作步骤: 说明: 应用场景: 简单的Web安全测试 ...(安全测试工具还有burpsuit,fiddler等) ...火狐浏览器新的版本很多都可以,本次验证版本:70.0.1 (64 ...2. 在请求的url里面修改要查询的参数...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 306,035
精华内容 122,414
关键字:

修改浏览器请求参数