AJAX javascript的跨域访问执行

跨域访问是指在浏览器中向不同源的服务器请求数据时出现的安全限制。为了在深度讨论 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()方法。示例代码如下: // 找到class为child的父元素 $(‘.child’).parent() // 找到第一个class为child的父元素 $(‘.child’).first().parent() // 找到class…

    jquery 2023年5月28日
    00
  • Python中的jquery PyQuery库使用小结

    针对“Python中的jquery PyQuery库使用小结”的完整攻略,我将从以下几个方面进行详细讲解: PyQuery库的安装及引入; PyQuery库的基本使用方法; PyQuery库的高级用法; 示例说明。 1. PyQuery库的安装及引入 PyQuery库是Python中一个基于jQuery语法的HTML/XML解析库,方便编写抓取代码,因此是爬…

    jquery 2023年5月27日
    00
  • 基于axios请求封装的vue应用实例代码

    下面就是基于axios请求封装的vue应用实例代码的完整攻略。 什么是axios? axios是一个基于Promise的HTTP客户端,用于浏览器和Node.js。它是一个很流行的JavaScript库,常用于跨域请求和RESTful API。axios总的来说,比jQuery、fetch等其他的HTTP库更加强大,也更加易用。 axios如何在Vue项目中…

    jquery 2023年5月28日
    00
  • jQuery UI Dialog resizeStart事件

    以下是关于 jQuery UI Dialog resizeStart 事件的详细攻略: jQuery UI Dialog resizeStart 事件 resizeStart 事件是在用户开始调整对话框大小时触发的事件。可以使用该事件来执行一些操作,例如禁用对话框的某些元素或显示调整大小的提示。 语法 $(selector).dialog({ resizeS…

    jquery 2023年5月11日
    00
  • jquery操作select大全

    让我们来详细讲解”jQuery操作select大全”攻略。 一、获取select的选中项 我们可以使用jQuery来获取select元素的选中项。我们可以通过以下代码来获取当前选中项的值: //获取select元素 var selectElement = $("select"); //获取当前选中项的值 var selectedValue…

    jquery 2023年5月28日
    00
  • jquery事件绑定方法介绍

    下面是详细讲解“jquery事件绑定方法介绍”的攻略: jQuery事件绑定方法介绍 在jQuery中,我们可以使用事件绑定方法来响应用户的操作,比如点击、鼠标移入移出等事件。下面是jQuery常用的事件绑定方法: 1. 绑定事件 语法: $(selector).bind(event, data, handler) 参数说明: selector:被选中的元素…

    jquery 2023年5月27日
    00
  • XMLHttpRequest处理xml格式的返回数据(示例代码)

    下面是XMLHttpRequest处理XML格式返回数据的完整攻略: 1. XMLHttpRequest介绍 XMLHttpRequest对象是现代浏览器中用于与服务器交换数据的标准化API。它可以通过HTTP协议请求数据和提交数据,通常被用来异步加载数据,以避免页面刷新。 XMLHttpRequest对象最初是由Microsoft引入的,后来被W3C标准化…

    jquery 2023年5月27日
    00
  • jQWidgets jqxExpander expanded属性

    jQWidgets jqxExpander expanded属性 jQWidgets是一个基于jQuery的UI组件库,提供了丰富UI组件和工具包括表格下等。jqxExpander是jQWidgets的一个组件,用于创建可折叠的面板。jqxExpander提供了多个属性,其中括expanded属性。本文将详细介绍jqxExpander的expanded属性,…

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