HTTP Status 404 的详细解决思路

维基百科:

HTTP 404或Not Found错误消息是HTTP的其中一种“标准回应消息”(HTTP状态码),此消息表明客户端在浏览网页时,服务器没法正常提供消息,或是服务器没法回应且不知缘由。一般是由于用户所访问的对应网页已被删除被移动或从未存在。404也是互联网上最多见的错误之一。404错误消息可能与“server not found”(没法找到服务器)或其余相似消息产生混淆。javascript

简单说,就是服务器中所请求的资源不存在,或者存在的状况下,咱们发送的请求经过URL(统一资源定位符)在服务器没有找到所需资源。css

什么是URL

出现404最多见的的是路径错误。让咱们先了解下URL。 URL,(Uniform Resource Locator)统一资源定位符,又叫统一资源定位器、定位地址、URL地址,俗称网页地址或简称网址。正如其名,就是用于定位服务的资源在哪?发送的Request去哪里找,而后服务器再作出相应的逻辑响应(Response)。html

统一资源定位符的标准格式以下:java

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

统一资源定位符的完整格式以下:nginx

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

举个栗子:git

http://127.0.0.1:8080/f?kw=%BA%A3%D4%F4%CD%F5&fr=ala0&tpl=5
复制代码

http,是协议;127.0.0.1,是个人服务器地址; 8080,是服务器上的端口号; /f,是路径;其中/ 分隔目录和子目录。 ?kw=%BA%A3%D4%F4%CD%F5&fr=ala0&tpl=5,是查询。? 分隔实际的URL和参数,这里很容易出错。虽然数据(除了数字)都会转换成以UTF8的URL编码,& 用于参数间的分隔符,= 等于(不是赋值),初次以外,还有+表示空格,#表示书签。github

格式须要注意的地方: 1)通常使用Tomcat和nginx等服务器启动的项目,须要查看端口是否正确。 2)协议名http/https,域名或者ip地址是否有误? 3)/分割符,以 / 区别路径中的每个目录名称。这样咱们咱们能够根据URL一层层的去查找咱们项目的目录,分析出现404可能的缘由是否为路径错误或者资源不存在。 3)&表示的参数,能够预估其值是否达到预期。web

一次完整Http请求

了解咱们请求的过程有助于咱们理解web的大致运行流程。 整体流程以下: 域名解析 --> 发起TCP的3次握手 --> 创建TCP链接后发起http请求 --> 服务器响应http请求,浏览器获得html代码 --> 浏览器解析html代码,并请求html代码中的资源(如js、css、图片等) --> 浏览器对页面进行渲染呈现给用户。 下面咱们详细讲解下它们都干了些什么?面试

1)DNS域名解析

dns是什么?将主机域名转换为ip地址,属于应用层协议,使用UDP传输。 dns工做原理: 1、主机向本地域名服务器的查询通常都是采用递归查询。
2、本地域名服务器向根域名服务器的查询的迭代查询。浏览器

  1. 当用户输入域名时,浏览器先检查本身的缓存中是否 这个域名映射的ip地址,有解析结束。
    2)若没命中,则检查操做系统缓存(如Windows的hosts)中有没有解析过的结果,有解析结束。
    3)若无命中,则请求本地域名服务器解析( LDNS)。
    4)若LDNS没有命中就直接跳到根域名服务器请求解析。根域名服务器返回给LDNS一个 主域名服务器地址。
    5) 此时LDNS再发送请求给上一步返回的gTLD(通用顶级域),接受请求的gTLD查找并返回这个域名对应的Name Server的地址
    6) Name Server根据映射关系表找到目标ip,返回给LDNS
    7) LDNS缓存这个域名和对应的ip,把解析的结果返回给用户,用户根据TTL值缓存到本地系统缓存中,域名解析过程至此结束。

2)发起TCP的3次握手,创建TCP链接

tcp为何要三次握手?谢希仁的《计算机网络》给出的解释是为了防止已失效的链接请求报文段忽然又传送到了服务端,于是产生错误。三次握手过程: 第一次握手:创建链接时,客户端发送syn包(syn=j)到服务器,并进入SYN_SEND状态,等待服务器确认;

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

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

完成三次握手,客户端与服务器开始传送数据。

有人说会不会由于丢包而致使404错误?可能性极小,来看看伟大的前人给TCP的付出,这里不得不提 TCP是如何保证可靠传输的,与上面三次握手协议都是校招面试的重点。

1.三次握手。
2.将数据截断为合理的长度。应用数据被分割成 TCP 认为最适合发送的数据块(按字节编号,合理分片)
3.超时重发。当 TCP 发出一个段后,它启动一个定时器,若是不能及时收到一个确认就重发
4.确认应答:对于收到的请求,给出确认响应
5.校验和:校验出包有错,丢弃报文段,不给出响应
6.序列号:对失序数据进行从新排序,而后才交给应用层
7.丢弃重复数据:对于重复数据 , 可以丢弃重复数据
8.流量控制。TCP 链接的每一方都有固定大小的缓冲空间。TCP 的接收端只容许另外一端发送接收端缓冲区所能接纳的数据。这将防止较快主机导致较慢主机的缓冲区溢出。
9.拥塞控制。当网络拥塞时,减小数据的发送。

3) 创建TCP链接后发起http请求

http是一个无状态的请求/响应协议,可是这不能知足如今的业务,因此有了cookie和session,它们都是用于保存状态的。

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

咱们也能够打开谷歌-->F12进入到调试模式-->Network-->查看信息。里面包含不少请求信息或者响应信息,咱们也能够基于它们进行开发操做。

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

方法名 用意
POST 请求处理数据,通常用于修改,新增资源
GET 只用在读取数据,不作修改,返回指定的页面
DELETE 删除所指定的资源
TRACE 主要用于测试或诊断,不经常使用
CONNECT 一般用于SSL加密服务器的连接,用于给可以将链接改成管道方式的代理服务器。

注:这里提一下cookie和session的区别(面试常考):

1,存储的位置不一样。cookie:存放在客户端,session:存放在服务端。Session存储的数据比较安全

2,存储的数据类型不一样。二者都是key-value的结构,但针对value的类型是有差别的

cookie:value只能是字符串类型,session:value是Object类型

3,存储的数据大小限制不一样。cookie:大小受浏览器的限制,不少是是4K的大小, session:理论上受当前内存的限制,

4,生命周期的控制。cookie的生命周期当浏览器关闭的时候,就消亡了

(1)cookie的生命周期是累计的,从建立时,就开始计时,30分钟后,cookie生命周期结束,

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

4)服务器响应http请求,浏览器获得html代码

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

html页面主要由dom、css、javascript等部分构成,还可能引入img、iframe等其余资源。浏览器接收到html代码,多是一份完整的文档,也多是一个chunk,即开始解析。解析过程是先构建dom树,再根据dom树构建渲染树,最后浏览器将渲染树绘制到页面上。

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

什么是渲染?渲染 在电脑绘图中是指用软件从模型生成图像的过程,也就是将咱们Html的逻辑转换成咱们肉眼可见的对象。具体课看博客:sylvanassun.github.io/2017/10/03/…

出现404的一些解决办法

1)目录不能被引用。 排错方法:

在 Eclipse的“包资源管理器(Package Explorer)”检查文件存放的位置。因为META-INF

WEB-INF文件夹下的内容没法对外发布,因此,若是你引用了带这两个目录的文件,确定是不容许。例如: http://localhost:8080/guestbook/WEB-INF/index.html就是错误的

文件位置存放错误

2)URL输入错误。排错方法:

首先,查看URL的IP地址和端口号是否书写正确。

其次,查看上下文路径是否正确 Project--------Properties------MyElipse-----Web-----

Web Context-root检查这个路径名称是否书写正确。

最后,检查一下文件名称是否书写正确。 3)未部署Web应用

4)Tomcat服务器中web.xml中的问题。 排错方法:

若是你的web应用程序有多个jsp页面的话,当你点击你web应用程序的虚拟根目录时可能会出现404错 误,只是你只须要修改Tomcat服务器中web.xml

 <init-param>
 
        <param-name>listings</param-name>
 
        <param-value>false(将其该为true)</param-value>
 
  </init-param>
复制代码

补充说明:在6.0.18 版本error:“ The requested resource () is not available. ”

老是没法访问/myapp/*.jsp文件,能够将 /ROOT 中build.xml 文件copy 一份到myapp,  注意把里面全部的 ROOT 用 myapp 代替. 应该就OK.

5)WEB-INF下面必需要有几个固定的文件夹和文件

 ±web.xml 该web app的配置文件
 
 ±lib 该web app用到的库文件
 
 ±classes存放编译好的servlet 
复制代码

请注意他们的名字,我曾经就因为把classes写成class,查错查了半宿还没解决,因此写这些的时候千万要仔细,要不会浪费更多的精力去查错。

六、若是要运行的不是.jsp文件,而是servlet(.class)文件,要配置web.xml(固然是WEB-INF下面的),加上如下字段:

 <servlet>
 
      <servlet-name>HelloWorldServlet</servlet-name>
 
      <servlet-class>HelloWorldServlet</servlet-class>
 
 </servlet>
 
 <servlet-mapping>
 
      <servlet-name>HelloWorldServlet</servlet-name>
    
      <url-pattern>/HelloWorldServlet</url-pattern>
 
 </servlet-mapping>
复制代码

其中的“HelloWorldServlet”改成你要运行的文件名

7)struts.xml配置错误,多是你的Action值写错或者连接URL写错

下面是我本身的解决办法,不少书都是导入六个文件,我本身的话是多增长了commons-lang3-3.1.jar和javassist-3.11.GA.jar

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

下载地址:download.csdn.net/detail/ahy1…

解决用例往后遇到持续更新ing....

相关文章
相关标签/搜索