JavaScript中跨域问题的深入理解

JavaScript中跨域问题的深入理解

什么是跨域请求

在Web开发中,当a.com的JavaScript通过XMLHttpRequest发起对b.com的请求,此时在浏览器中会因为同源策略(Same-Origin Policy)而被阻止,这个错误就是跨域请求报错。同源策略是由浏览器同源策略规定的一个标准来限制页面脚本在不同域的文档/源中进行交互的安全机制。

当协议,域名或者端口号有任何一个不同的时候,我们都认为这是跨域请求。

常用结局跨域请求的方法

JSONP

JSONP (JSON with padding)是一种跨域请求的技术。JSONP并不是一种新的网络请求方式,而是一种网页在服务器上动态生成JSON数据的技术,在“JSON”和“Padding”二者的帮助下完成了在不同来源之间获取数据的任务。

  1. JSONP的原理

(1) 前端代码定义一个callback回调函数。

(2) 发起一个GET请求,并且请求的URL中包含callback回调函数的名称和随机数(防止缓存)。

(3) 服务器接受请求后,将数据打包成一个JSON对象,并将callback函数的名称和数据一起返回给前端(JavaScript)。

(4) 前端拿到响应结果后,会自动的调用callback回调函数,并将响应结果作为参数传入。

示例代码:

前端代码:

function handleResponse(data) { 
   console.log(data);
}
var script = document.createElement('script');
script.src = 'https://xxx.com/test?callback=handleResponse';
document.body.appendChild(script);

后端代码:

function test(request, response) { 
   // 拼接数据和callback函数名称
   const res = JSON.stringify({ a: 1, b: 2 })
   const callback = request.query.callback
   response.end(callback + '(' + res + ')')
}
  1. JSONP的缺点

  2. 只支持GET方法

  3. 存在安全风险(难以避免XSS攻击)

CORS

CORS(Cross-Origin Resource Sharing,跨源资源共享)是W3C标准,是目前最完善的解决跨域问题的方案。通过在Response header中添加一些验证信息,CORS可以在不需要前端或后端做任何特殊处理的情况下进行跨源请求,在安全和性能两方面都具有优势。

CORS可以使用以下方式验证:

  • Origin:表示请求方的域名。
  • Access-Control-Allow-Origin:表示允许这个域的哪些请求可以通过。
  • Access-Control-Allow-Credentials:是否允许携带cookie,值为true或false
  • Access-Control-Allow-Methods:表示允许这个域的哪些请求方法可以通过。例如:GET, POST, PATCH, PUT, DELETE。
  • Access-Control-Allow-Headers:表示允许这个域的哪些请求头可以通过。例如:content-type,x-requested-with。

示例代码:

前端代码:

fetch('https://xxx.com/test', {
    method: 'GET',
    headers: {
        'Content-Type': 'application/json'
    },
    credentials: 'include'
})
    .then(response => response.json())
    .then(data => console.log(data))
    .catch(error => console.error(error));

后端代码:

function test(request, response) { 
   // 设置允许接收跨域访问的源名称
    response.setHeader('Access-Control-Allow-Origin', 'https://foo.com,https://bar.com');
    // 允许跨域访问的http请求方法
    response.setHeader('Access-Control-Allow-Methods', 'GET, OPTIONS');
    response.setHeader('Access-Control-Allow-Credentials', true);
    response.setHeader('Access-Control-Allow-Headers', 'X-Requested-With, Content-Type');
    if (request.method === "OPTIONS") {
        response.end();
        return;
    }
    const res = JSON.stringify({ a: 1, b: 2 });
    response.end(res);
}

代理请求

服务器端以后端接口调用为例,代码如下。具体思路:

  1. 前端通过jQuery、axios、fetch等库将请求发送给自己的服务器(本地服务器和接口服务器跨域)
  2. 后台接收到请求,再将请求转发给接口服务器
  3. 将接口服务器返回的数据原封不动的返回给前端。

优点:

不需要前端和后端进行配置,只需要后端对代理服务器进行设置。

缺点:

会增加代理层的成本和复杂度

示例代码:

前端代码:

fetch('https://xxx.com/api/test', {
        method: 'GET',
        headers: {
          'Content-Type': 'application/json; charset=UTF-8',
        },
      })
      .then(res => res.json())
      .then(data => {
        this.setState({
          data: data,
        });
      })
      .catch(error => {
        console.log(error);
      });

后端代码:

const proxyRequest = (req, res) => {
  const targetUrl = "https://xxx.com";
  // 此处应解析前端发送的请求数据并转发给对应的API接口
  // 请求转发
  const url = targetUrl + req.url;
  const options = {
    url: url,
    method: req.method,
  };
  request(options, (err, response, body) => {
    if (!err && response.statusCode === 200) {
      const info = JSON.parse(body);
      res.json(info || {});
    } else {
      res.sendStatus(500);
    }
  });
};

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:JavaScript中跨域问题的深入理解 - Python技术站

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

相关文章

  • Nginx跨域访问场景配置和防盗链详解

    以下是关于“Nginx跨域访问场景配置和防盗链详解”的完整攻略: 简介 在使用Nginx作为Web服务器时,我们可能需要进行跨域访问场景配置和防盗链。本文将介绍如何在Nginx中进行跨域访问场景配置和防盗链。 跨域访问场景配置 1. 配置CORS CORS(Cross-Origin Resource Sharing)是一种机制,允许Web页面从不同的域访问服…

    http 2023年5月13日
    00
  • 详解BadTokenException报错解决方法

    以下是关于“详解BadTokenException报错解决方法”的完整攻略: 简介 在Android开发中,BadTokenException是一种常见的异常,通常是由于试在无效的上下文显示对话框弹出窗口而引起的。本文将介绍BadTokenException的基本概念、常原因以及如何解决BadTokenException。 本概念 BadTokenExcep…

    http 2023年5月13日
    00
  • java模拟http请求的错误问题整理

    以下是关于“java模拟http请求的错误问题整理”的完整攻略: 问题描述 在Java开发中,我们经常需要模拟http请求来测试我们的应用程序。但是,在模拟http请求的过程中,我们可能会遇到各种错误。这些错误可能会导致我们的应用程序无法正常工作,因此我们需要及时解决这些问题。下面我们将介绍一些常见的java模拟http请求的错误问题以及解决方法。 解决方法…

    http 2023年5月13日
    00
  • 关于springmvc报错404的问题

    以下是关于“关于springmvc报错404的问题”的完整攻略: 简介 在使用SpringMVC框架时,有时会出现404错误的问题。本文将介绍解决SpringVC报错404的方法,并提供两个示例说明。 解决步骤 以下是解决SpringMVC报错404的方法: 步骤一:检查URL地址 先,需要检查URL地址是否正确。如果URL地址不正确,将会导致404错误。可…

    http 2023年5月13日
    00
  • jquery 重写 ajax提交并判断权限后 使用load方法报错解决方法

    对于“jquery重写ajax提交并判断权限后使用load方法报错解决方法”的攻略,我将分成以下几个部分进行讲解: 问题分析:分析出现的问题是什么,可能出现的原因有哪些; 解决思路:如何解决这个问题,我们应该采取什么样的思路; 解决方法:根据解决思路,列出具体的代码和操作步骤,以解决这个问题。 1. 问题分析 首先,我们需要明确一下出现的问题。从问题描述中可…

    http 2023年5月13日
    00
  • JS XMLHttpRequest原理与使用方法深入详解

    以下是关于“JSXMLHttpRequest原理与使用方法深入详解”的完整攻略: 简介 XMLHttpRequest是JavaScript中的一个重要的API,用于在浏览器发送HTTP请求和接收HTTP响应。本文将深介绍XMLHttpRequest的原理和使用方法。 原理 XMLHttpRequest的原理是通过HttpRequest对象向服务器发送HTTP…

    http 2023年5月13日
    00
  • 电脑常见问题与解决方案

    电脑常见问题解决方案 1. 电脑开机无显示屏问题 问题描述 当电脑开机后,显示器没有任何显示。 可能原因 显示器或电脑连接线松动。 显卡坏了。 主板或CPU故障。 解决方案 检查显示器和电脑连接线是否插紧。 如果连接线正常,尝试用新的连接线连接电脑和显示器。如果还是无法显示,可能是显卡坏了,需要更换。 如果更换了新的显卡还是无法解决问题,很可能是主板或CPU…

    http 2023年5月13日
    00
  • ASP.NET Core读取Request.Body的正确方法

    ASP.NET Core是一个开源的跨平台Web应用程序框架,其中读取请求正文的能力是一个非常重要的功能。本文将会提供ASP.NET Core的正确方法来读取请求体的完整攻略。 1. 读取Request.Body的正确方法 在ASP.NET Core中读取请求正文的正确方法是使用StreamReader从Request.Body中读取数据。这个方法可以确保能…

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