JavaScript 九种跨域方式实现原理

下面是“JavaScript 九种跨域方式实现原理”的完整攻略。

1. 跨域概述

所谓跨域,即提到网页中使用了访问来源不同的域名。例如,在 www.example.com 中嵌入了来自 api.example.net 的请求。这种情况下就需要通过跨域来完成交互操作。一般来说,跨域请求是被浏览器所禁止的。因此我们需要寻找别的解决方案来满足我们的需求。

2. CORS(跨源资源共享)

CORS 是一种机制,它使用附加的 HTTP 头部来告诉浏览器,让运行在一个源上的 Web 应用程序被准许访问来自不同源的选定的资源。具体情况下可参考MDN文档

由于之前的同源策略限制,浏览器并不能发送跨域请求。但在服务器端进行配置,即在请求头部信息之中,配置Access-Control-Allow-Origin即可解决。

另外还需要注意,CORS请求默认不会发送cookie和HTTP认证信息到服务器端。如果这些信息也是必须的,那么需要在前端和后端添加如下字段。

Access-Control-Allow-Credentials:true

3. JSONP

在不支持CORS的旧时代,我们可以使用JSONP(JSON with Padding)技术实现跨域。这种技术在发送请求时,利用script标签,发起GET请求,在响应中返回 JavaScript 函数,并将需要传递到客户端的数据作为参数传递到JavaScript函数内部。在客户端,我们创建一个同名的JavaScript函数,从而让返回的函数被调用执行。

具体的实现方式如下:

function jsonp(url, callback) {
    var script = document.createElement('script');
    script.async = true;
    script.src = url + '?callback=' + callback;
    document.getElementsByTagName('head')[0].appendChild(script);
}

其中,url为请求地址,callback为远程服务端返回的回调函数名。具体操作时,可以先在前端定义一个函数,然后以该函数名作为callback的参数名来发送远程请求,最终,在服务器段向前端返回一个同名的带参数的函数,从而实现跨域通信。

4. WebSocket

WebSocket 是HTML5提出的新协议,用于在客户端和服务器之间建立双向通信的连接。与HTTP不同的是,WebSocket是一种持久化的协议,其连接是始终开放的,并且双方可以随时发送数据。

在建立连接时,浏览器发送一个HTTP请求,请求头包括了一些特殊的字段来表示哥伦姆希望升级为WebSocket连接。服务器端进行验证通过后,浏览器和服务器端就可以进行双向通信了。

WebSocket相对于HTTP协议的优势在于,通信会话都是在同一连接之中,它不需要发起 HTTP 请求,因此, 避免了HTTP球的添加延迟。

在实践中,我们可以使用socket.io这个封装库,通过服务器来进行WebSocket连接。

实例1-使用CORS进行跨域

浏览器中的请求头部信息展示如下:

Access-Control-Allow-Credentials: true
Access-Control-Allow-Origin: http://localhost:4000
Access-Control-Expose-Headers: *
Content-Length: 15
Content-Type: application/json; charset=utf-8
Date: Sat, 05 Sep 2020 11:13:32 GMT
ETag: W/"f-RX6BhjNthz0TgIOCgHWvjrhkgbQ"
X-Powered-By: Express

其中Access-Control-Allow-Origin字段指定了允许跨域访问的源地址,这里设为http://localhost:4000。而前面提到的Access-Control-Allow-Credentials字段则说明允许跨域请求的时候,能够发送HTTP认证信息。实际使用的时候,我们可以在baseUrl上设置withCredentials为true来进行设置。

实例2-使用WebSocket进行跨域

var socket = io('http://localhost:7001', {
        transports: ['websocket'],
    });

在这段代码中可以看到,我们是通过socket.io这个封装库,来进行跨域通信的。其中,io方法的第一个参数是服务器端的地址,第二个参数则是传递的选项信息,其中transports可用于传递连接的设定信息,设定为websocket表示我们将使用WebSocket进行通信。

以上是JavaScript 实现跨域技术的九种方式以及两个示例的具体攻略。希望对你有用。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:JavaScript 九种跨域方式实现原理 - Python技术站

(0)
上一篇 2023年5月27日
下一篇 2023年5月27日

相关文章

  • jQuery实现ajax回调函数带入参数的方法示例

    下面就详细讲解“jQuery实现ajax回调函数带入参数的方法示例”的完整攻略。 什么是ajax回调函数 在讲解“jQuery实现ajax回调函数带入参数的方法示例”前,我们先来了解一下什么是ajax回调函数。 在使用jQuery发起ajax请求时,我们会使用$.ajax()方法,该方法接受一个对象作为参数,其中最重要的是success参数,指定了ajax请…

    jquery 2023年5月28日
    00
  • jQuery Mobile Toolbar updatePagePadding()方法

    jQuery Mobile是一款快速创建响应式移动Web应用程序的JavaScript库。其中,ToolBar是jQuery Mobile的一项重要功能,提供了灵活的布局和导航方式。jQuery Mobile Toolbar updatePagePadding()方法是用于在更改工具栏内容后调整页面的填充( padding) 的方法,下面将对该方法进行详细讲…

    jquery 2023年5月12日
    00
  • 基于jquery步骤进度条源码分享

    关于“基于jquery步骤进度条源码分享”的完整攻略,我将从以下几个方面进行讲解: 一、什么是jquery步骤进度条? jquery步骤进度条是一款基于jquery实现的进度条效果,可以用于展示多个步骤的进度,并且可以根据用户不断地操作和反馈自动更新进度。 该进度条的实现方式,在页面上使用一个容器元素,通过不断向该容器增加或删除进度节点来控制进度条的前进或后…

    jquery 2023年5月28日
    00
  • jQWidgets jqxEditor print()方法

    jQWidgets jqxEditor print()方法 jQWidgets是一个基于jQuery的UI组件库,提供了丰富的UI组件和工具包括表格、下拉等。jqxEditor是jQWidgets的件之一,用于创建富文编辑器。print()方法是jqxEditor的一个方法,用于打印编辑器中的内容。 print()方法的基本语法 print()方法用于打印编…

    jquery 2023年5月9日
    00
  • 超简单的jquery的AJAX用法

    让我仔细为你讲解 “超简单的jquery的AJAX用法” 的完整攻略。 什么是 AJAX AJAX(Asynchronous JavaScript and XML)是指一种创建交互式、快速响应 Web 应用程序的网页开发技术。使用 AJAX 技术,你可以通过异步的方式发出 HTTP 请求,而无需页面刷新,从而提高 Web 应用程序的性能和用户体验。 jQue…

    jquery 2023年5月27日
    00
  • Jquery中map函数的用法

    以下是关于Jquery中map函数的用法的完整攻略: 1. 简介 Jquery 中的 map() 函数是一种遍历函数,它能够将一个数组或对象中的每个元素传递给指定的回调函数进行处理,并将所有回调函数返回值组合成一个新的数组或对象返回。它与 forEach() 和 each() 函数类似,但是不同之处在于它可以设置回调函数的返回值,并将这些返回值组合成一个新的…

    jquery 2023年5月27日
    00
  • jQWidgets jqxMenu keyboardNavigation属性

    以下是关于 jQWidgets jqxMenu 组件中 keyboardNavigation 属性的详细攻略。 jQWidgets jqxMenu keyboardNavigation 属性 jQWidgets jqxMenu 组件的 keyboardNavigation 属性用于启用或禁用键盘导航功能。启用该功能后,用户可以使用键盘上的方向键和回车键来浏览…

    jquery 2023年5月12日
    00
  • jQuery获取单击节点对象的方法

    jQuery获取单击节点对象的方法,可以通过以下步骤实现: 首先,我们需要使用jQuery的事件处理函数——click()函数,为我们需要获取节点对象的元素绑定单击事件。 $(‘li’).click(function(){ // 在这里获取单击节点对象 }); 在这个例子中,我们为所有li元素绑定了单击事件。这个事件将会在用户单击任何一个li元素时触发。 在…

    jquery 2023年5月28日
    00
合作推广
合作推广
分享本页
返回顶部