全网多种方法分析解决HTTP Status 404资源未找到的错误,TCP的3次握手,dns域名解析,发起http请求以及cookie和session的区别

news2024/12/27 2:25:08

文章目录

  • 1. 文章引言
  • 2. 简述URL
  • 3. http完整请求
    • 3.1 DNS域名解析
    • 3.2 TCP的3次握手
    • 3.3 发起http请求
    • 3.4 浏览器解析html代码
    • 3.5 浏览器对页面进行渲染呈现给用户
  • 4. 解决404错误的方法
  • 5. 补充知识点
    • 5.1 cookie和session的区别
    • 5.2 ChatGPT的介绍

1. 文章引言

正赶上最近ChatGPT很火,于是借助ChatGPT来解释HTTP Status 404,如下所示:

在这里插入图片描述

HTTP Status 404:

The HTTP Status 404 means that the requested resource was not found on the server. This is commonly used in response to a failed HTTP request and can be caused by mistyping an URL, spelling mistakes, or trying to access a file or resource that no longer exists.

可惜的是,ChatGPT给出的是英文的解释,我们不妨翻译成中文,如下所示:

HTTP状态404表示在服务器上找不到请求的资源。这通常用于响应失败的 HTTP 请求,可能是由于键入错误的URL、拼写错误或尝试访问不再存在的文件或资源引起的。

根据翻译可知,如果我们请求的资源在服务器中不存在,或者资源虽然存在,但我们发送的请求(URL)在服务器没有找到该所需资源,便会报出404的错误。

404错误也是互联网上最常见的错误之一,该错误消息可能与server not found(无法找到服务器)或其他类似消息产生混淆。

2. 简述URL

上文提到了URL,出现404最常见的的是路径(URL)错误。

那么什么是URL,它有怎么样的魅力?接下来我便分析它。

URL的全称是Uniform Resource Locator,中文翻译是统一资源定位符,又叫统一资源定位器、定位地址、URL地址,俗称网页地址或简称网址。

正如其名,就是用于定位服务的资源在哪?发送的Request去哪里找,然后,服务器再做出逻辑响应(Response)。

  1. 统一资源定位符的标准格式如下:

[协议类型]://[服务器地址]:[端口号]/[资源层级UNIX文件路径][文件名]?[查询]#[片段ID]

  1. 统一资源定位符的完整格式如下:

[协议类型]://[访问资源需要的凭证信息]@[服务器地址]:[端口号]/[资源层级UNIX文件路径][文件名]?[查询]#[片段ID]

比如此URLhttp://127.0.0.1:8081/user/list?kerword=test&username=jack,其中格式如下:

  1. http是协议

  2. 127.0.0.1是服务器地址

  3. 8081是服务器上的端口号

  4. /user/list是路径

  5. 其中/分隔目录和子目录。

  6. ?kerword=test&username=jack是查询。

?分隔实际的URL和参数,这里很容易出错。

&用于参数间的分隔符,= 等于(不是赋值)。

除此之外,还有+表示空格,#表示书签。

数据(除了数字)都会转换成以UTF8URL编码。

格式需要注意的地方:

  1. 一般使用Tomcatnginx等服务器启动的项目,需要查看端口是否正确。

  2. 协议名http/https,域名或者ip地址是否有误?

  3. /分割符,以/ 区别路径中的每一个目录名称。这样我们我们可以根据URL一层层的去查找我们项目的目录,分析出现404可能的原因是否为路径错误或者资源不存在。

  4. &表示的参数可以预估其值是否达到预期

3. http完整请求

我们为什么了解http请求呢?

了解http请求的过程有助于我们理解web的大体运行流程。

总体流程如下:

  1. 先域名解析

  2. 然后发起TCP3次握手

  3. 其次建立TCP,连接后发起http请求

  4. 再次服务器响应http请求,浏览器得到html代码

  5. 接着浏览器解析html代码,并请求html代码中的资源(如js、css、图片等

  6. 最后浏览器对页面进行渲染呈现给用户。

接下来,我便详细讲解它们都干些什么?

3.1 DNS域名解析

dns是什么?

它使用UDP传输的方式,将主机域名转换为ip地址,属于应用层协议,。

dns工作原理:

  1. 主机向本地域名服务器的查询一般都是采用递归查询。

  2. 本地域名服务器向根域名服务器的查询的迭代查询。

    • 当用户输入域名时,浏览器先检查自己的缓存中是否存在这个域名映射的ip地址,有则解析结束。

    • 若没命中,则检查操作系统缓存(如Windowshosts)中有没有解析过的结果,有则解析结束。

    • 若无命中,则请求本地域名服务器解析( LDNS)。

    • LDNS没有命中,就直接跳到根域名服务器请求解析。根域名服务器返回给LDNS一个主域名服务器地址。

    • 此时LDNS再发送请求给上一步返回的gTLD( 通用顶级域), 接受请求的gTLD查找并返回这个域名对应的Name Server的地址。

    • Name Server根据映射关系表找到目标ip,返回给LDNS

    • LDNS缓存这个域名和对应的ip, 把解析的结果返回给用户,用户根据TTL值缓存到本地系统缓存中,域名解析过程至此结束。

dns解析的整体流程如下图所示:

在这里插入图片描述

3.2 TCP的3次握手

tcp为什么要三次握手?是为了防止已失效的连接请求报文段突然又传送到了服务端,因而产生错误。

三次握手过程如下:

  1. 第一次握手:建立连接时,客户端发送syn包(syn=j)到服务器,并进入SYN_SEND状态,等待服务器确认。

  2. 第二次握手:服务器收到syn包,必须确认客户的SYN(ack=j+1),同时自己也发送一个SYN(syn=k),即SYN+ACK包,此时服务器进入SYN_RECV状态。

  3. 第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次握手。

完成三次握手,客户端与服务器开始传送数据,如下图所示:

在这里插入图片描述

有人问会不会因为丢包而导致404错误?可能性极小,这里不得不提TCP是如何保证可靠传输的 (与上面三次握手协议都是校招面试的重点),如下所示:

  1. 三次握手

  2. 将数据截断为合理的长度。应用数据被分割成TCP认为最适合发送的数据块(按字节编号,合理分片)

  3. 超时重发。当TCP发出一个段后,它启动一个定时器,如果不能及时收到一个确认就重发

  4. 确认应答:对于收到的请求,给出确认响应

  5. 校验和:校验出包有错,丢弃报文段,不给出响应

  6. 序列号:对失序数据进行重新排序,然后才交给应用层

  7. 丢弃重复数据:对于重复数据 , 能够丢弃重复数据

  8. 流量控制。TCP连接的每一方都有固定大小的缓冲空间。TCP的接收端只允许另一端发送接收端缓冲区所能接纳的数据。这将防止较快主机致使较慢主机的缓冲区溢出

  9. 拥塞控制。当网络拥塞时,减少数据的发送

3.3 发起http请求

http是一个无状态的请求/响应协议,但是这不能满足现在的业务。

因此,出现了用于保存状态的cookiesession

一个完整的HTTP请求报文包括请求行(request line)、请求头部(header)、空行和请求数据四个部分组成。如下图所示:

在这里插入图片描述

当然,我们也可以打开浏览器(如chrome,edge,火狐等)的调试模式:

  1. F12进入到调试模式

  2. 找到Network(edge浏览器叫做网络)

  3. 查看信息。

【注意】如果你的F12不生效,可以尝试使用fn + F12。若这样还不生效,可以点击鼠标右键,找到并单击检查即可。

打开浏览器的调试模式后,你会看到很多请求信息或响应信息,我们也可以基于它们进行开发操作,如下图所示:

在这里插入图片描述

我们再了解HTTP请求的常见方法:GET,POST,DELETE,TRACE ,CONNECT

在这里插入图片描述

3.4 浏览器解析html代码

浏览器在解析html代码时,并请求html代码中的资源(如jscss、图片等)。

html页面主要由domcssjavascript等部分构成,还可能引入imgiframe等其他资源。

浏览器接收到html代码,可能是一份完整的文档,也可能是一个chunk,即开始解析。

解析过程是先构建dom树,再根据dom树构建渲染树,最后浏览器将渲染树绘制到页面上。

3.5 浏览器对页面进行渲染呈现给用户

什么是渲染?

渲染在电脑绘图中是指用软件从模型生成图像的过程,也就是将我们html的逻辑转换成我们肉眼可见的对象。

具体参看博客:浏览器渲染过程与性能优化

4. 解决404错误的方法

  1. 目录不能被引用。

可以在Eclipse包资源管理器(Package Explorer)检查文件存放的位置。

由于META-INFWEB-INF文件夹下的内容不对外发布,如果你引用了带这两个目录的文件,肯定是不允许,如下URL地址就是错误的:

 http://localhost:8081/testProject/WEB-INF/index.html
  1. URL输入错误,如下为排错方法:

    • 先查看URLIP地址和端口号是否书写正确。

    • 其次查看上下文路径是否正确,比如Project -> Properties -> MyElipse -> Web -> Web Context-root,检查这个路径名称是否书写正确。

    • 最后检查一下文件名称是否书写正确。

  2. 未部署Web应用

  3. Tomcat器中web.xml中的问题

假如,你的web应用程序有多个jsp页面,当你点击web应用程序的虚拟根目录时,可能会出现404错误

此时,你只需要修改Tomcat服务器中web.xml,如下代码所示:

<!-- 将false修改为true -->
<init-param>
   <param-name>list</param-name> 
   <param-value>false</param-value> 
</init-param>

如果在6.0.18版本errorThe requested resource () is not available. 总是无法访问/myapp/*.jsp文件,可以将 /ROOTbuild.xml文件copy一份到myapp

【注意】把里面所有的ROOTmyapp代替, 应该就OK。

  1. WEB-INF下面必须要有几个固定的文件夹和文件

    • web.xmlweb app的配置文件

    • libweb app用到的库文件

    • classes存放编译好的servlet

请注意这些名字,我曾经把classes写成class,查错查了半宿还没解决。

所以,写这些时千万要仔细,要不会浪费更多的精力去查错。

  1. 如果运行的是servlet(.class)文件,而非.jsp文件,需在web.xml中加上以下字段:
 <servlet>
      <servlet-name>TestServlet</servlet-name>
      <servlet-class>TestServlet</servlet-class>
 </servlet>
 
 <servlet-mapping>
      <servlet-name>TestServlet</servlet-name>
      <url-pattern>/TestServlet</url-pattern>
 </servlet-mapping>

其中,TestServlet改为你要运行的文件名。

【注意】web.xmlWEB-INF下面的。

  1. struts.xml配置错误

可能是你的Action值写错,或者链接URL写错。

比如commons-lang3-3.1.jar文件到WEB-INF/lib目录下,struts2最新的web开发包如下:

在这里插入图片描述

当然,如果你的是maven项目,直接在pom.xml中引入jar包即可,如下所示:

<!--apache配置开始-->
<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-lang3</artifactId>
    <version>3.7</version>
</dependency>
<!--apache配置结束-->
  1. 检查同一个项目,是否启动了多个java服务

有时,后台没有关闭之前的服务,你又重新启动,可能会报错404

5. 补充知识点

5.1 cookie和session的区别

  1. 存储的位置不同:

    • cookie:存放在客户端

    • session:存放在服务端,session存储的数据比较安全

  2. 存储的数据类型不同:两者都是key-value的结构,但针对value的类型是有差异的:

    • cookievalue只能是字符串类型

    • sessionvalueObject类型

  3. 存储的数据大小限制不同:

    • cookie:大小受浏览器的限制,很多是是4K的大小

    • session:理论上受当前内存的限制

  4. 生命周期的控制,cookie的生命周期随着浏览器关闭而消亡。

    • cookie的生命周期是累计的,从创建时,就开始计时,30分钟后,cookie生命周期结束

    • session的生命周期是间隔的,从创建时,开始计时如在30分钟,没有访问session,那么session生命周期被销毁

5.2 ChatGPT的介绍

之前喜欢使用谷歌翻译报错的信息,自从出现了ChatGPT,便喜欢使用ChatGPT来翻译。

如果你想了解什么是ChatGPT以及它的用法,可以点击如下链接:

  1. 全网最详细的介绍ChatGPT

  2. ChatGPT、低代码等技术出现会不会导致底层程序员失业

  3. 全网推荐7款github上有趣的ChatGPT的应用源码

  4. 如何调用ChatGPT的API接口到官方例子的说明以及GitHub上的源码应用

  5. 全网详细解读基于java调用ChatGPT的API接口

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

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

相关文章

将springboot项目生成可依赖的jar,并引入到项目中

1、将springboot项目生成可依赖的jar包的方法 SpringBoot项目默认打包的是可运行jar包&#xff0c;也可以打包成不可运行的jar包。 能打成可运行的jar包是因为&#xff0c;Spring Boot 项目引入了 spring-boot-maven-plugin 依赖包。 spring-boot-maven-plugin具有repackage …

【自学Linux】 Linux文件目录结构

Linux文件目录结构 Linux文件目录结构教程 在 Linux 中&#xff0c;有一个很经典的说法&#xff0c;叫做一切皆文件&#xff0c;因此&#xff0c;我们在系统学习 Linux 之前&#xff0c;首先要了解 Linux 的文件目录结构。Linux 主要的目录有三大类&#xff0c;即根目录(/)&a…

火山引擎 DataTester:A/B 测试,让企业摆脱广告投放“乱烧钱”

更多技术交流、求职机会&#xff0c;欢迎关注字节跳动数据平台微信公众号&#xff0c;回复【1】进入官方交流群 在广告投放的场景下&#xff0c;一线广告优化师通常会创建多个计划&#xff0c;去测试不同的广告素材效果。这套方法看似科学&#xff0c;实际上却存在诸多问题&…

NJ/NX将数据写入到SD中,保存为CSV文件格式

NJ/NX将数据写入到SD中&#xff0c;保存为CSV文件格式 实验时间&#xff1a;2022.10.31 实验人员&#xff1a;钱少青 实验器材&#xff1a;NJ501-1300(Ver:1.12)&#xff0c;HMC-SD291(2G)&#xff0c;SysmacStudio(ver:1.52) 实验目的&#xff1a;将Byte、Int、Real、Stri…

3年功能3年自动化,从8k到23k的学习过程

简单的先说一下&#xff0c;坐标杭州&#xff0c;14届本科毕业&#xff0c;算上年前在阿里巴巴的面试&#xff0c;一共有面试了有6家公司&#xff08;因为不想请假&#xff0c;因此只是每个晚上去其他公司面试&#xff0c;所以面试的公司比较少&#xff09;其中成功的有4家&…

ICLR 2022—你不应该错过的 10 篇论文(下)

CV - 计算机视觉 | ML - 机器学习 | RL - 强化学习 | NLP 自然语言处理 ICLR 2023已经放榜&#xff0c;但是今天我们先来回顾一下去年的ICLR 2022&#xff01; ICLR 2022将于2022年 4 月 25 日星期一至 4 月 29 日星期五在线举行&#xff08;连续第三年&#xff01;&#x…

Java中ThreadLocal类详解

ThreadLocal从名字上我们看出&#xff0c;它叫做本地线程变量&#xff0c;每个线程都有各自的的变量&#xff0c;而不再是我们之前的两个线程共用同一个变量&#xff1b;以这个类创建的变量&#xff0c;在多个线程都用到这个变量时&#xff0c;可以为每一个线程创建一个变量副本…

sql server执行md5加密的时候,字符串前带N和不带N的结果是不一样的

最近因为项目的需要&#xff0c;报表中需要对数据进行MD5加密&#xff0c;结果报表系统得出来的sql语句&#xff0c;字符串前都自动带了N&#xff0c;执行时&#xff0c;发现得到的结果跟在数据库中执行的sql&#xff08;字符串不带N&#xff09;得的值不一样&#xff0c;最后自…

RocketMQ高性能原理分析

目录一、读队列与写队列1.概念介绍2.读写队列个数关系分析二、消息持久化1.持久化文件介绍2.持久化结构介绍&#xff1a;三、过期文件删除1.如何判断文件过期2.什么时候删除过期文件四、高效文件写1.零拷贝技术加速文件读写2.文件顺序写3.刷盘机制五、 消息主从复制六、负载均衡…

微服务项目【消息推送(RabbitMQ)】

创建消费者 第1步&#xff1a;基于Spring Initialzr方式创建zmall-rabbitmq消费者模块 第2步&#xff1a;在公共模块中添加rabbitmq相关依赖 <!--rabbitmq--> <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-bo…

有趣的HTML实例(十三) 咖啡选择(css+js)

一个人追求目标的路途是孤单的&#xff0c;一个人独品辛酸的时候是寂寥的&#xff0c;一个人马不停蹄的追赶着&#xff0c;狂奔着&#xff0c;相信前方是一片光明&#xff0c;我从不放弃希望&#xff0c;就像我对生活的信念&#xff0c;没有人可以动摇。 ——《北京青年》 目录…

Qt扫盲- QLocalSocket类

QLocalSocket类总结一、概述二、使用一、概述 QLocalSocket类是一个比较特殊的传输数据的的一个工具类&#xff0c;它和 QTcpSocket 的区别就是&#xff0c;这个QLocalServer 只是在connectToServer 的时候连接主机是用的一个字符串或者标识符来表示主机&#xff0c;而QTcpSoc…

基于模型预测控制(MPC)的悬架系统仿真分析

目录 前言 1.悬架系统 2.基于MPC的悬架系统仿真分析 2.1 simulink模型 2.2仿真结果 2.3 结论 3 总结 前言 模型预测控制是无人驾驶中较为热门的控制算法&#xff0c;但是对于悬架等这类系统的控制同样适用。 我们知道模型预测控制主要可以划分为三个部分&#xff1a; …

ForkJoinPool原理

1、概述 Fork/Join框架是Java7提供了的一个用于并行执行任务的框架。ForkJoinPool是Java中提供了一个线程池&#xff0c;特点是用来执行分治任务。主题思想是将大任务分解为小任务&#xff0c;然后继续将小任务分解&#xff0c;直至能够直接解决为止&#xff0c;然后再依次将任…

再谈Java的String字符串

我们先看下面几个常见的面试题&#xff1a; String s1 "abc";String s2 new String("abc");String s3 "a" "b" "c";String s4 s2.intern();System.out.printf("s1s2:%s\n", s1 s2);System.out.printf(&quo…

IOS安全区域适配

对于 iPhone 8 和以往的 iPhone&#xff0c;由于屏幕规规整整的矩形&#xff0c;安全区就是整块屏幕。但自从苹果手机 iphoneX 发布之后&#xff0c;前端人员在开发移动端Web页面时&#xff0c;得多注意一个对 IOS 所谓安全区域范围的适配。这其实说白了就是 iphoneX 之后的苹果…

Django图书商场购物系统python毕业设计项目推荐

mysql数据库进行开发&#xff0c;实现了首页、个人中心、用户管理、卖家管理、图书类型管理、图书信息管理、订单管理、系统管理等内容进行管理&#xff0c;本系统具有良好的兼容性和适应性&#xff0c;为用户提供更多的网上图书商城信息&#xff0c;也提供了良好的平台&#x…

【APP渗透测试】 Android APP渗透测试技术实施以及工具使用(客户端服务端)

文章目录前言一、安全威胁分析二、主要风险项三、Android测试思维导图四、反编译工具五、Android客户端漏洞一、Jnaus漏洞漏洞二、数据备份配置风险漏洞漏洞三、Activity组件泄露漏洞漏洞四、BroadcastReceiver组件泄露漏洞漏洞五、允许模拟器Root环境登录漏洞漏洞六、未识别代…

LeetCode 刷题之 BFS 广度优先搜索【Python实现】

1. BFS 算法框架 BFS&#xff1a;用来搜索 最短路径 比较合适&#xff0c;如&#xff1a;求二叉树最小深度、最少步数、最少交换次数&#xff0c;一般与 队列 搭配使用&#xff0c;空间复杂度比 DFS 大很多DFS&#xff1a;适合搜索全部的解&#xff0c;如&#xff1a;寻找最短…

C++类和对象补充

目录 前言&#xff1a; 1. 构造函数->初始化列表 1.1 初始化列表出现原因 1.2 初始化列表写法 2. explicit关键字 2.1 explict的出现 2.2 explict的写法 3. static成员 4. 友元 4.1 友元函数 4.2 友元类 5. 内部类和匿名对象 5.1 内部类 5.2 匿名对象 前言&a…