请求接口时跨域问题详细解决方案

ops/2024/11/15 0:16:32/

浏览器中的报错:
在这里插入图片描述
跨域问题通常需要前端后端协作解决。以下是一些常用的解决方法,分别从前端后端的角度进行讲解:

一. 后端解决方案

  1. 设置 CORS 头部
    最常用和推荐的方法是后端服务器设置 Access-Control-Allow-Origin 响应头来允许特定的前端域名访问资源。

    Access-Control-Allow-Origin: https://your-frontend-domain.com
    

    如果需要支持所有域,可以设置为 *,但出于安全考虑,最好指定具体的域名。

  2. Preflight 请求处理
    对于除 GETPOSTHEAD 之外的非简单请求,浏览器会先发送一个 OPTIONS 请求来询问服务器是否允许跨域请求。后端需要正确响应这个预检请求,并设置相应的 Access-Control-Allow-MethodsAccess-Control-Allow-Headers 头部。

    Access-Control-Allow-Methods: GET, POST, PUT, DELETE
    Access-Control-Allow-Headers: Content-Type, Authorization
    
  3. Cookie 支持
    如果需要在跨域请求中携带 Cookie(例如,用于用户身份验证),后端需要设置 Access-Control-Allow-Credentialstrue,并且不能将 Access-Control-Allow-Origin 设置为 *

    Access-Control-Allow-Credentials: true
    

二. 前端解决方案

1.使用代理服务器

使用代理服务器解决跨域问题是一种常见的做法,尤其是在开发环境中。这种方法的核心思想是将前端应用的跨域请求转发到代理服务器,然后由代理服务器将请求转发到目标服务器,并将响应返回给前端。这样,从浏览器的角度看,所有的请求都是发送给了同源的代理服务器,从而避免了跨域问题。

以下是使用代理服务器解决跨域问题的步骤:

1.1 设置代理服务器

前端项目中,你可以使用各种工具和框架来设置代理服务器。以下是一些常见的方法:

1.1.1 使用 Vue CLI

如果你的项目是基于 Vue.js 并且使用了 Vue CLI,你可以在项目的 vue.config.js 文件中配置代理:

module.exports = {devServer: {proxy: {'/api': { // 匹配所有到 /api 的请求target: 'http://aider.meizu.com', // 目标服务器的地址changeOrigin: true, // 是否改变请求头中的Origin字段pathRewrite: {'^/api': '' // 重写请求路径,去掉路径中的 /api}}}}
};

本人在项目中的使用案例代码:
我项目中的接口:
http://aider.meizu.com/app/weather/listWeather?cityIds=101240101
在这里插入图片描述
组件中使用:
在这里插入图片描述

1.1.2 使用 Create React App

如果你的项目是基于 React.js 并且使用了 Create React App,你可以在 package.json 文件中添加代理配置:

{"proxy": "http://aider.meizu.com"
}

这会自动将所有非静态资源请求代理到指定的服务器。

1.1.3 使用 Webpack Dev Server

如果你使用的是 Webpack Dev Server,可以在 webpack.config.jswebpack.dev.js 中配置代理:

module.exports = {// ...devServer: {proxy: {'/api': { // 匹配所有到 /api 的请求target: 'http://aider.meizu.com', // 目标服务器的地址changeOrigin: true,pathRewrite: {'^/api': '' // 重写请求路径,去掉路径中的 /api}}}}
};
1.2 发送请求

配置好代理后,你可以在前端代码中发送请求,就像请求是同源的一样。例如,如果你配置了 /api 路径的代理,你可以这样发送请求:

axios.get('/api/app/weather/listWeather?cityIds=101240101').then(response => {console.log(response.data);}).catch(error => {console.error('Error fetching weather data:', error);});
1.3注意事项
  • 安全性:在生产环境中使用代理时,需要确保代理服务器的安全性,避免潜在的安全风险。
  • 性能:代理服务器可能会引入额外的网络延迟,尤其是在代理服务器与目标服务器之间的网络延迟较大时。
  • 维护性:使用代理服务器可能会增加系统的复杂性,需要额外的维护工作。

使用代理服务器解决跨域问题是开发中常用的方法,特别是在开发阶段,它可以有效地避免跨域问题,使得前端开发更加顺畅。

2. JSONP

对于只支持 GET 请求的跨域数据获取,可以使用 JSONP。但这种方法逐渐被更现代的 CORS 替代,因为它只支持 GET 请求,并且不如 CORS 安全。

function jsonp(url, callback) {const script = document.createElement('script');script.src = `${url}?callback=${callback}`;document.head.appendChild(script);
}
3.PostMessage

对于需要从不同源接收数据的场景,可以使用 window.postMessage 方法。这种方法适用于像 iframe 这样的场景,其中两个窗口需要安全地传递消息。

// 发送消息
window.parent.postMessage('Hello there!', '*');// 接收消息
window.addEventListener('message', (event) => {console.log('Received message:', event.data);
});
4. 使用第三方服务

对于不想或不能修改后端代码的情况,可以使用第三方 CORS 代理服务,如 CORS Anywhere。这些服务作为一个中间人,将请求转发到目标服务器并返回响应。

// 通过第三方服务代理请求
fetch('https://cors-anywhere.herokuapp.com/http://example.com/api/data');

三. 综合考虑

  • 安全性:在后端设置 CORS 是最安全的方法,因为它允许服务器精确控制哪些源可以访问资源。
  • 灵活性:使用代理服务器在开发环境中提供了灵活性,但可能不适合生产环境。
  • 兼容性:JSONP 和 PostMessage 提供了兼容性解决方案,但有其局限性。

在实际应用中,推荐优先考虑后端设置 CORS,因为它提供了最好的安全性和控制。对于开发环境,代理服务器是一个实用的解决方案。


http://www.ppmy.cn/ops/133715.html

相关文章

Hbase入门

目录 Hbase逻辑结构 一、基础知识 1. Hbase逻辑结构 行键(Rowkey)&#xff1a;唯一标识一行数据&#xff0c;按照字典序(row_key1 < row_key11 < rowkey2)排列.列Col&#xff1a;数据记录的一条属性列族&#xff1a;将多列划分为一类&#xff0c;视为一个列族。例如上图…

Hadoop生态圈框架部署(六)- HBase完全分布式部署

文章目录 前言一、Hbase完全分布式部署&#xff08;手动部署&#xff09;1. 下载Hbase2. 上传安装包3. 解压HBase安装包4. 配置HBase配置文件4.1 修改hbase-env.sh配置文件4.2 修改hbase-site.xml配置文件4.3 修改regionservers配置文件4.4 删除hbase中slf4j-reload4j-1.7.33.j…

12 go语言(golang) - 数据类型:接口

接口 在 Go 语言中&#xff0c;接口&#xff08;interface&#xff09;是一种抽象类型&#xff0c;它定义了一组方法的集合&#xff0c;但不包含这些方法的实现。是 Go 语言实现多态和面向对象编程的重要机制之一。 1、接口定义 在 Go 中&#xff0c;接口通过 type 关键字进…

pytorch3d导入maya相机位姿踩坑

目的是将maya中的相机无缝导入到pytorch3d中 坑1: 直接导出maya中相机的欧拉角以及Trans, 然后直接导入pytorch3d中 问题所在: maya中直接导出的相机旋转角以及Trans是 c2w, 而根据文档https://pytorch3d.org/docs/cameras 中的一句话, 经过R可以实现world to view的变换, 所…

云服务器和物理服务器的区别有哪些?

云服务器是服务器集群虚拟为多个性能可配的虚拟主机&#xff0c;云服务器的基础依旧是需要物理服务器的&#xff0c;要用海量的物理服务器集群进行建构&#xff0c;以此来形成云端虚拟资源池&#xff0c;根据企业的自身需求&#xff0c;来从资源池中进行资源分配。 物理服务器则…

3DTiles之i3dm介绍

3DTiles之i3dm介绍 3D Tiles 是一种用于高效存储和传输三维城市、建筑、地形、点云等空间数据的开放标准格式。i3dm&#xff08;Intel 3D Model&#xff09;是 3D Tiles 中用于表示三维模型&#xff08;如建筑物或其他对象&#xff09;的一个子格式。i3dm 格式的出现&#xff…

MongoDB在现代Web开发中的应用

&#x1f493; 博客主页&#xff1a;瑕疵的CSDN主页 &#x1f4dd; Gitee主页&#xff1a;瑕疵的gitee主页 ⏩ 文章专栏&#xff1a;《热点资讯》 MongoDB在现代Web开发中的应用 MongoDB在现代Web开发中的应用 MongoDB在现代Web开发中的应用 引言 MongoDB 概述 定义与原理 发展…

Sqoop学习

目录 一、Soop简介 二、Sqoop的安装 1. 上传压缩包到/opt/install目录下 2.解压 3.修改文件名 4.拷贝sqoop-1.4.7.bin__hadoop-2.6.0目录下的sqoop-1.4.7.jar包到/opt/soft/sqoop147目录下 5.拷贝sqoop-1.4.7.bin__hadoop-2.6.0/lib目录下该jar包到sqoop/lib目录下 6.复…