AJAX javascript的跨域访问执行

yizhihongxing

跨域访问是指在浏览器中向不同源的服务器请求数据时出现的安全限制。为了在深度讨论 AJAX 的跨域访问之前,需要先了解一下同源策略。

同源策略

同源策略是由 Netscape 提出的一个重要的安全策略。当一个浏览器创建一个Web页面的时候,它会创建一个域,这个域通常是页面的 URL(Domain)。

同源策略触发的条件包括以下三方面:

  1. 协议相同
  2. 域名相同
  3. 端口相同

比如,http://www.example.com/page1.htmlhttp://www.example.com/page2.html 属于同一个域,而 http://www.example.com:8080/page1.htmlhttp://www.example.com/page1.html 不属于同一个域。

同源策略不允许跨域获取网页中的数据,发起异步请求来获取数据。AJAX 是异步请求的一种方式,所以在同一个域中使用 AJAX 不会有问题。但是如果我们需要从不同的域请求数据,那么 AJAX 就会遇到跨域问题。

跨域访问

跨域访问是指在浏览器中向不同源的服务器请求数据时出现的安全限制。遇到跨域访问时,浏览器会发出提示警告,拒绝向其他域提交信息并获取返回的数据。

例如,一个页面在访问http://192.168.1.10:8080/data.json获取数据时,就会被浏览器拒绝,因为它的域并不是http://192.168.1.10

解决方案

出于安全考虑,浏览器不允许跨域访问数据,但我们仍可以通过以下几个方案来解决跨域问题:

  1. JSONP
  2. CORS
  3. 代理

JSONP

JSONP(JSON with Padding)是一种跨域请求数据的方法,原理是在页面中创建一个 <script> 元素,设置其 src 属性为带有回调函数的跨域请求 URL,请求 URL 返回的是一些调用 JSONP 回调函数的脚本代码。这些脚本代码可以由 JS 引擎执行,获取跨域数据。

JSONP 的优点是兼容性好,缺点是只能发送 GET 请求。

以百度为例,需要从 http://www.baidu.com/sugrec 请求数据。可以写一个如下的代码:

let script = document.createElement("script");
script.src = "http://www.baidu.com/sugrec?wd=a&callback=callback";
document.body.appendChild(script);

function callback(data) {
    console.log(data);
}

CORS

CORS(Cross-Origin Resource Sharing)是一种现代的跨域请求数据的方法。

CORS 的实现原理是在服务器端进行设置。当客户端发起跨域请求时,服务器返回一个特殊的 HTTP 头部 Access-Control-Allow-Origin,指定客户端的域名或 IP,说明要允许哪些源访问资源。

CORS 的优点是比 JSONP 更安全,缺点是需要在服务器端进行配置。

以 Node.js 为例,需要在服务器端设置 CORS:

const http = require("http");

http.createServer((req, res) => {
    res.setHeader("Access-Control-Allow-Origin", "*");
    // 设置允许访问的域,* 代表允许所有域
    res.writeHead(200, {"Content-Type": "text/plain"});
    res.end("Hello World!");
}).listen(8888);

代理

代理方法是指通过本地服务器转发请求,从而间接访问目标服务器的数据。通过代理服务器访问远程服务器,前端 Java 虽然可以解决跨域问题,但会多一次网络请求的延迟,同时也多占用了一定的服务器带宽。

以 Axios 作为 HTTP 请求库,需要从 http://api.example.com/data.json 请求数据。可以写一个如下的代码:

axios.get("/api/data.json").then(response => {
  console.log(response);
});

在本地服务器使用代理将 /api/data.json 的请求转发到 http://api.example.com/data.json 即可:

const http = require("http");
const request = require("request");

http.createServer((req, res) => {
    if (req.url === "/api/data.json") {
        request("http://api.example.com/data.json").pipe(res);
    } else {
        res.writeHead(200, { "Content-Type": "text/plain" });
        res.end("Hello World!");
    }
}).listen(8888);

在前端代码中,保持不变,请求地址仍然是 /api/data.json

代码演示

以下是代码演示:

示例一:JSONP

<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <title>JSONP 示例</title>
</head>
<body>
  <script>
    function handleData(data) {
      console.log(data);
    }
    let script = document.createElement("script");
    script.src = "//api.flickr.com/services/feeds/photos_public.gne?tags=cat&format=json&jsoncallback=handleData";
    document.body.appendChild(script);
  </script>
</body>
</html>

示例二:CORS

以下是 Node.js 代码:

const http = require("http");

http.createServer((req, res) => {
    res.setHeader("Access-Control-Allow-Origin", "*");
    res.writeHead(200, {"Content-Type": "text/plain"});
    res.end("Hello World!");
}).listen(8888);

以下是前端代码:

fetch("http://localhost:8888")
    .then(response => response.text())
    .then(data => console.log(data));

示例三:代理

以下是 Node.js 代码:

const http = require("http");
const request = require("request");

http.createServer((req, res) => {
    if (req.url === "/api/data.json") {
        request("http://api.example.com/data.json").pipe(res);
    } else {
        res.writeHead(200, { "Content-Type": "text/plain" });
        res.end("Hello World!");
    }
}).listen(8888);

以下是前端代码:

axios.get("/api/data.json").then(response => {
  console.log(response);
});

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:AJAX javascript的跨域访问执行 - Python技术站

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

相关文章

  • jQuery 父系子系选择器

    以下是关于jQuery父系子系选择器的完整攻略: 什么是父系子系选择器? 父系子系选择器是jQuery中一种选择器,用于选择指定父元素下指定子元素。 如何使用父系子系选择器? 可以使用以下代码来选择指定父元素下的指定子元素: $("parent > child") 这个代码中,parent是指定的父元素,child是指定的子元素。 …

    jquery 2023年5月12日
    00
  • 巧用jQuery选择器提高写表单效率的方法

    关于“巧用jQuery选择器提高写表单效率的方法”,我们可以按照以下步骤进行讲解: 1. 选择器基础 首先,我们需要了解jQuery选择器的基础知识。jQuery选择器可以用于选取HTML元素、CSS选择器和自定义的选择器。其中,最简单的选择器是通过元素的tag名来选取元素。 例如,我们可以使用下面的代码选取所有的input元素: var inputs = …

    jquery 2023年5月27日
    00
  • servlet+jquery实现文件上传进度条示例代码

    下面为你详细讲解“servlet+jquery实现文件上传进度条示例代码”的完整攻略。 1. 准备工作 要实现文件上传进度条,需要用到两个技术:servlet和jquery。 1.1. servlet servlet是运行在服务器端的Java程序,它可以接收客户端的请求并返回相应的数据。在文件上传中,需要用到servlet来处理文件上传请求,包括获取上传文件…

    jquery 2023年5月27日
    00
  • jQWidgets jqxGrid closeablegroups属性

    以下是关于“jQWidgets jqxGrid closeablegroups属性”的完整攻略,包含两个示例说明: 简介 jqxGrid 控件的 closeablegroups 属性用于控制分组面板是否可关闭。 完整攻略 是 jqxGrid 控件 closeablegroups 属性的完整攻略: 属性值 closeablegroups 属性的值可以是以下之一…

    jquery 2023年5月10日
    00
  • jQWidgets jqxSplitter展开事件

    下面是详细讲解“jQWidgets jqxSplitter展开事件”的攻略: 什么是jqxSplitter jqxSplitter是jQWidgets库中的一种组件,用于实现页面中的分栏布局。 如何监听jqxSplitter的展开事件 要监听jqxSplitter的展开事件,首先需要创建一个jqxSplitter实例,并使用jqxSplitter的on方法,…

    jquery 2023年5月11日
    00
  • 基于jQuery实现的美观星级评论打分组件代码

    下面是关于“基于jQuery实现的美观星级评论打分组件代码”的完整攻略及两条示例说明。 一、前置内容 在讲解代码实现之前,我们需要先简单介绍一下前置内容。 1.1 jQuery jQuery是一个快速、简洁的JavaScript框架,它可以简化HTML文档遍历、事件处理、动画设计和AJAX交互等操作。因此,本组件的实现需要使用jQuery。 1.2 Font…

    jquery 2023年5月28日
    00
  • jQuery拖动布局其结果保存到数据库

    下面是详细的jQuery拖动布局并将结果保存到数据库的攻略。 1.概述 jQuery拖动布局是一种用户友好的Web设计技术,它允许用户自定义布局,通过自由拖拽不同组件来调整界面的外观和功能。此外,也可以将用户定制的布局结果保存到数据库并在将来访问时重新加载这些布局。 2.技术路线 下面的示例中,我们将使用jQuery UI库中的拖曳交互进行用户定制布局。将组…

    jquery 2023年5月28日
    00
  • jQWidgets jqxGauge LinearGauge enable()方法

    jQWidgets jqxGauge LinearGauge enable()方法 jQWidgets是一个基于jQuery的UI组件库,提供了丰富的UI组件和工具,包括表格、图表、日历、菜单等。jqxGauge和jqxLinearGauge是jQWidgets中的两个组件,用于显示仪表盘和线性仪表盘。这两个组件都提供了enable()方法,用于启用组件。 …

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