HTTP跨域、HTTP状态码、HTTP请求方式、C/S和B/S模式

1.跨域基本概念

   只要协议、域名、端口有任何一个不同,都被当作是不同的域。
   由于浏览器的同源策略,其限制之一是不能通过ajax的方法请求不同源的文档。第二个限制是浏览器中不同域的框架(iframe)间是不能进行js的交互操作的。

2.跨域方式有哪些

   1.通过document.domain跨域

     修改document.domain的方式只适用于不同子域的框架间的交互。

   2.通过location.hash跨域

     因为父窗口可以对iframe进行URL读写,iframe也可以读写父窗口的URL,URL有一部分被称为hash,就是#号及其后面的字符,它一般用于浏览器锚点定位,Server端并不关心这部分,应该说HTTP请求过程中不会携带hash,所以这部分的修改不会产生HTTP请求,但是会产生浏览器历史记录。

     此方法的原理就是改变URL的hash部分来进行双向通信。每个window通过改变其他 window的location来发送消息(由于两个页面不在同一个域下IE、Chrome不允许修改parent.location.hash的值,所以要借助于父窗口域名下的一个代理iframe),并通过监听自己的URL的变化来接收消息。

     这个方式的通信会造成一些不必要的浏览器历史记录,而且有些浏览器不支持onhashchange事件,需要轮询来获知URL的改变,最后,这样做也存在缺点,诸如数据直接暴露在了url中,数据容量和类型都有限等。

   3.通过HTML5的postMessage方法跨域

     高级浏览器Internet Explorer 8+, chrome,Firefox , Opera 和 Safari 都将支持这个功能。

     这个功能主要包括接受信息的"message"事件和发送消息的"postMessage"方法。比如damonare.cn域的A页面通过iframe嵌入了一个google.com域的B页面,可以通过以下方法实现A和B的通信

   4.通过jsonp跨域

     以上几种都是双向通信的,即两个iframe,页面与iframe或是页面与页面之间的。

     通过script标签引入的js是不受同源策略的限制的。所以我们可以通过script标签引入一个js或者是一个其他后缀形式(如php,jsp等)的文件,此文件返回一个js函数的调用。

      JSONP的优缺点:

          优点:它不像XMLHttpRequest对象实现的Ajax请求那样受到同源策略的限制;它的兼容性更好,在更加古老的浏览器中都可以运行,不需要XMLHttpRequest或ActiveX的支持;并且在请求完毕后可以通过调用callback的方式回传结果。

          缺点:它只支持GET请求而不支持POST等其它类型的HTTP请求;它只支持跨域HTTP请求这种情况,不能解决不同域的两个页面之间如何进行JavaScript调用的问题。 

   5.通过CORS跨域

     CORS(Cross-Origin Resource Sharing)跨域资源共享,定义了必须在访问跨域资源时,浏览器与服务器应该如何沟通。CORS背后的基本思想就是使用自定义的HTTP头部让浏览器与服务器进行沟通,从而决定请求或响应是应该成功还是失败。目前,所有浏览器都支持该功能,IE浏览器不能低于IE10。整个CORS通信过程,都是浏览器自动完成,不需要用户参与。对于开发者来说,CORS通信与同源的AJAX通信没有差别,代码完全一样。浏览器一旦发现AJAX请求跨源,就会自动添加一些附加的头信息,有时还会多出一次附加的请求,但用户不会有感觉。   

     CORS与JSONP的对比:

        JSONP只能实现GET请求,而CORS支持所有类型的HTTP请求。

        使用CORS,开发者可以使用普通的XMLHttpRequest发起请求和获得数据,比起JSONP有更好的错误处理。

        JSONP主要被老的浏览器支持,它们往往不支持CORS,而绝大多数现代浏览器都已经支持了CORS

3.后端修改请求头,实现cros跨域时,在发送post请求之前会先发送什么

     第一次是OPTIONS请求方式, 第二次才是正常的POST

     OPTIONS就是相当于在正式请求接口之前去获取以下header, 就是所设置的那些header. 如果在这次OPTIONS请求中服务器有返回正确的header, 这时才会执行后面真正的请求; 否则请求将会被拒绝, 并抛出错误.

4.常见HTTP状态码(HTTP状态码是服务器和客户端之间交流信息的语言)   

    1XX系列

    指定客户端应相应的某些动作,代表请求已被接受,需要继续处理。由于在HTTP/1.0协议中没有定义任何1xx状态码,所以除非在某些试验条件下,服务器禁止向此类客户端发送 1xx 响应。

    2XX系列

    代表请求已成功被服务器接收、理解、并接受。这系列中最常见的有200、201状态码。(http://jlyy0831.com)

    200状态码

    表示请求已成功,请求所希望的响应头或数据体将随此响应返回。

    201状态码

    表示请求成功并且服务器创建了新的资源,且其URI已经随Location头信息返回。假如需要的资源无法及时建立的话,应当返回【202 Accepted】。

    202状态码

    服务器已接受请求,但尚未处理。

    3XX系列

    代表需要客户端采取进一步的操作才能完成请求,这些状态码用来重定向,后续的请求地址(重定向目标)在本次响应的Location域中指明。这系列中最常见的有301、302状态码。

    301状态码

    被请求的资源已永久移动到新位置。服务器返回此响应(对GET或HEAD请求的响应)时,会自动将请求者转到新位置。

    302状态码

    请求的资源临时从不同的URI响应请求,但请求者应继续使用原有位置来进行以后的请求。(http://www.jl3652999.com)

    304状态码

    自从上次请求后,请求的网页未修改过。服务器返回此响应时,不会返回网页内容。 如果网页自请求者上次请求后再也没有更改过,您应将服务器配置为返回此响应(称为If-Modified-Since HTTP标头)。

    4XX系列

    表示请求错误。代表了客户端看起来可能发生了错误,妨碍了服务器的处理。常见有:401、404状态码。

    401状态码

    请求要求身份验证。 对于需要登录的网页,服务器可能返回此响应。

    403状态码

    服务器已经理解请求,但是拒绝执行它。与401响应不同的是,身份验证并不能提供任何帮助,而且这个请求也不应该被重复提交。

    404状态码

    请求失败,请求所希望得到的资源未被在服务器上发现。没有信息能够告诉用户这个状况到底是暂时的还是永久的。假如服务器知道情况的话,应当使用410状态码来告知旧资源因为某些内部的配置机制问题,已经永久的不可用,而且没有任何可以跳转的地址。404这个状态码被广泛应用于当服务器不想揭示到底为何请求被拒绝或者没有其他适合的响应可用的情况下。

    5xx系列

    代表了服务器在处理请求的过程中有错误或者异常状态发生,也有可能是服务器意识到以当前的软硬件资源无法完成对请求的处理。常见有500、503状态码。

    500状态码

    服务器遇到了一个未曾预料的状况,导致了它无法完成对请求的处理。一般来说,这个问题都会在服务器的程序码出错时出现。

    503状态码

    由于临时的服务器维护或者过载,服务器当前无法处理请求。通常,这个是暂时状态,一段时间会恢复。

    504状态码

    504错误代表网关超时 (Gateway timeout),是指服务器作为网关或代理,但是没有及时从上游服务器收到请求。

5.从浏览器输入地址到页面渲染完成之间发生了什么   

    1.DNS解析:将域名地址解析为IP地址;
    2.TCP连接:TCP三次握手
      -第一次握手,由浏览器发起,告诉服务器我要发送请求了;
      -第二次握手,由服务器发起,告诉浏览器我准备接收了;
      -第三次握手,有浏览器发起,告诉服务器,我即将发送;
    3.发送请求;(请求报文)
    4.接受响应;(响应报文)
    5.渲染页面
      -浏览器用响应的解析器解析HTML、CSS、JS文件
    6断开连接:TCP四次挥手
      -第一次挥手:由浏览器发起,告诉服务器请求报文发送完了,准备关闭;
      -第二次挥手:由服务器发起,告诉浏览器请求报文接收完了,准备关闭;
      -第三次挥手:由服务器发起,告诉浏览器响应报文发送完了,准备关闭;
      -第四次挥手:由浏览器发起,告诉服务器响应报文接收完了,准备关闭。

6.http请求方式(8种)

    HTTP/1.1协议中共定义了八种方法(有时也叫“动作”),来表明Request-URL指定的资源不同的操作方式

    HTTP1.0定义了三种请求方法: GET, POST 和 HEAD方法。

    HTTP1.1新增了五种请求方法:OPTIONS, PUT, DELETE, TRACE 和 CONNECT 方法  

    1、OPTIONS
      返回服务器针对特定资源所支持的HTTP请求方法,也可以利用向web服务器发送‘*’的请求来测试服务器的功能性
    2、HEAD
      向服务器索取与GET请求相一致的响应,只不过响应体将不会被返回。这一方法可以再不必传输整个响应内容的情况下,就可以获取包含在响应小消息头中的元信息。
    3、GET
      向特定的资源发出请求。注意:GET方法不应当被用于产生“副作用”的操作中,例如在Web Application中,其中一个原因是GET可能会被网络蜘蛛等随意访问。Loadrunner中对应get请求函数:web_link和web_url
    4、POST
      向指定资源提交数据进行处理请求(例如提交表单或者上传文件)。数据被包含在请求体中。POST请求可能会导致新的资源的建立和/或已有资源的修改。 Loadrunner中对应POST请求函数:web_submit_data,web_submit_form
    5、PUT
      向指定资源位置上传其最新内容
    6、DELETE
      请求服务器删除Request-URL所标识的资源
    7、TRACE
      回显服务器收到的请求,主要用于测试或诊断
    8、CONNECT
      HTTP/1.1协议中预留给能够将连接改为管道方式的代理服务器。
    注意:
      1)方法名称是区分大小写的,当某个请求所针对的资源不支持对应的请求方法的时候,服务器应当返回状态码405(Mothod Not Allowed);当服务器不认识或者不支持对应的请求方法时,应返回状态码501(Not Implemented)。
      2)HTTP服务器至少应该实现GET和HEAD/POST方法,其他方法都是可选的,此外除上述方法,特定的HTTP服务器支持扩展自定义的方法。   

  请求响应步骤:

    客户端连接到Web服务器->发送Http请求->服务器接受请求并返回HTTP响应->释放连接TCP连接->客户端浏览器解析HTML内容  

  http是超文本传输协议,默认端口号为80,客户端是动态的,浏览器会自动默认为80

  https默认端口号为443

7.简述C/S和B/S模式的区别  

    C / S 也称为客户端/服务器模式。服务器通常使用高性能PC,工作站或小型计算机,并使用大型数据库系统,如Oracle,Sybase,Informix或SQL Server。客户端需要安装专用的客户端软件。

    B / S 是Brower / Server的缩写。客户端只需要安装浏览器,例如Netscape Navigator或Internet Explorer。服务器安装Oracle,Sybase,Informix或SQL Server等数据库。浏览器通过Web服务器与数据库交互。

  不同的硬件环境:   

    C / S 一般建立在专用网络,小范围的网络环境中,然后通过专用LAN服务器提供连接和数据交换服务。

    B / S 建立在WAN上。它不必是专用的网络硬件环境。例如,它连接到互联网,租用设备。信息由其自身管理。适应范围比C / S更强。通常,只要有操作系统和浏览器。

  不同的安全要求:   

    C / S 通常面向相对固定的用户组,并且对信息安全具有很强的控制力。通常,高度机密的信息系统采用C / S结构。它可以通过B / S部分发布。

    B / S 建立在WAN上,其安全控制能力相对较弱,并且是一个不可知的用户组。

  不同的程序架构:   

    C / S 程序可以更加注重进程,可以检查多级权限,并可以较少考虑系统的运行速度。

    B / S 对安全性和访问速度的多重考虑是基于对更多优化的需求。从MS的.Net系列开始,具有比C / S更高要求的程序架构是一种发展趋势。 BizTalk 2000 Exchange 2000等,完全支持网络组件构建系统。 SUN和IBM推出JavaBean组件技术等,使B / S更加成熟。

  软件重用是不同的:

    C / S 程序不可避免地被视为一个整体,并且组件的可重用性不如B / S要求下的组件的可重用性。

    B / S 对的多重结构需要相对独立的组件功能。它可以相对较好地重复使用。购买的桌子可以重复使用,而不是墙上的石桌。

8.HTTP协议、TCP协议、IP协议分别在应用层,传输层,网络层。

9.http2.0与http1.x相比有哪些优化/http发展历程  

    1.新的二进制格式(Binary Format)

      HTTP1.x的解析是基于文本。基于文本协议的格式解析存在天然缺陷,文本的表现形式有多样性,要做到健壮性考虑的场景必然很多,二进制则不同,只认0和1的组合。基于这种考虑HTTP2.0的协议解析决定采用二进制格式,实现方便且健壮。

    2.多路复用(MultiPlexing)

      即连接共享,即每一个request都是是用作连接共享机制的。一个request对应一个id,这样一个连接上可以有多个request,每个连接的request可以随机的混杂在一起,接收方可以根据request的 id将request再归属到各自不同的服务端请求里面。

    3.header压缩

      HTTP1.x的header带有大量信息,而且每次都要重复发送,HTTP2.0使用encoder来减少需要传输的header大小,通讯双方各自cache一份header fields表,既避免了重复header的传输,又减小了需要传输的大小。

    4.服务端推送(server push)

      同SPDY一样,HTTP2.0也具有server push功能。

原文地址:https://www.cnblogs.com/yxkNotes/p/12704042.html