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

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

一. 后端解决方案

  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,因为它提供了最好的安全性和控制。对于开发环境,代理服务器是一个实用的解决方案。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/914195.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

同三维T610UDP-4K60 4K60 DP或HDMI或手机信号采集卡

1路DP/HDMI/TYPE-C(手机/平板等)视频信号输入1路MIC1路LINE OUT,带1路HDMI环出,USB免驱,分辨率4K60,可采集3路信号中其中1路,按钮切换,可采集带TYPE-C接口的各品牌手机/平板/笔记本电脑等 同三维…

初级数据结构——顺序表

目录 前言一、定义与特点二、类型三、基本操作四、应用场景五、优缺点六、元素插入和删除动态图解插入删除 七、代码模板八、使用顺序表的经典例题1.求奇数的乘积代码题解 2.数值统计代码题解 九、总结结语 前言 顺序表示最基础的数据结构之一,它也是我们学习开始学…

arkUI:遍历数据数组动态渲染(forEach)

arkUI:遍历数据数组动态渲染(forEach) 1 主要内容说明2 相关内容2.1 ForEach 的基本语法2.2 简单遍历数组2.2 多维数组遍历2.4 使用唯一键2.5 源码1的相关说明2.5.1 源码1 (遍历数据数组动态渲染)2.5.2 源码1运行效果 …

新的恶意软件活动通过游戏应用程序瞄准 Windows 用户

一种新的恶意软件 Winos4.0 被积极用于网络攻击活动。FortiGuard实验室发现,这种先进的恶意框架是从臭名昭著的 Gh0strat 演变而来的,配备了模块化组件,可在受感染的设备上进行一系列恶意活动。 这些攻击已在游戏相关应用程序中发现&#xf…

Maven学习——创建Maven的Java和Web工程,并运行在Tomcat上

一、Maven介绍 Maven 是一款为 Java 项目管理构建、依赖管理的工具(软件),使用 Maven 可以自动化构建、测试、打包和发布项目,大大提高了开发效率和质量。 二、Maven安装步骤 1.下载后解压到没有空格、特殊字符和中文的目录中 2…

【刷题】优选算法

优选算法 双指针 202. 快乐数 链接:. - 力扣(LeetCode) 【思路】 第一个实例是快乐数,因为会变为1且不断是1的循环 第二个实例不可能为1,因为会陷入一个没有1的循环 根据两个实例和鸽巢原理可以发现不断的平方和最…

在unity中实现把普通的照片,图片 变成油画风格的shader实现

可以通过对shader的Radius的值得设置来改变油画风格的力度,0最小,10是最大。

【项目开发 | 跨域认证】JSON Web Token(JWT)

未经许可,不得转载。 文章目录 JWT设计背景:跨域认证JWT 原理JWT 结构JWT 使用方式注意JSON Web Token(缩写 JWT)是目前最流行的跨域认证解决方案,本文介绍它的原理、结构及用法。 JWT设计背景:跨域认证 互联网服务的用户认证流程是现代应用中的核心组成部分,通常的流程…

vue3中如何实现标准元素 拖动 功能 【收藏备用】

最近在用vue3做一个企业后台管理系统的项目,在登录页面的时候需要用户滑动滑块来获取验证码登录系统 用到了元素拖放 这里也顺便记录一下 如何使用的. 目录 1.功能介绍 2.代码部分 3 实现过程 3.1 设置可拖动元素 3.2 拖动什么 3.3 放到何处 3.4 进行放置 1.功能介绍…

Linux(CentOS)运行 jar 包

1、在本地终端运行,关闭终端,程序就会终止 java -jar tlias-0.0.1-SNAPSHOT.jar 发送请求,成功 关闭终端(程序也会终止) 发送请求,失败 2、在远程终端运行,关闭终端,程序就会终止 …

Local Dimming和Mini LED简介

文章目录 Local Dimming和Mini LED的介绍区别和联系联系区别总结 Local Dimming和Mini LED的介绍 电视显示技术中的Local Dimming和Mini LED都是用于提升画面质量的背光技术,主要目的是增强对比度和改善黑色表现。以下是对它们的详细介绍: Local Dimmin…

数据结构选择题及答案

一、选择题 1、下列查找方法中,( )适用于查找有序单链表。 A.分块查找; B.哈希查找; C.顺序查找; D.二分查找; 2、在有n个结点的二叉树的二叉链表表示中,空指针数为( )。 A&#xf…

npm完整发包流程(亲测可验证)

1. 准备工作 (1) 在npm官网上注册一个账号 (2) 注册成功之后,npm会发送一封邮件给你,点击邮件里面的链接,做确认关联操作(必需) 2. 创建自己的npm包 (…

3.2 软件需求:面对过程分析模型

面对过程分析模型 1. 需求分析的模型概述1.1 面对过程分析模型-结构化分析方法1.2 结构化分析的过程 2. 功能模型:数据流图初步2.1 加工2.2 外部实体(数据源点/终点)2.3 数据流2.4 数据存储2.5 注意事项 3. 功能模型:数据流图进阶…

【机器学习】机器学习中用到的高等数学知识-1.线性代数 (Linear Algebra)

向量(Vector)和矩阵(Matrix):用于表示数据集(Dataset)和特征(Feature)。矩阵运算:加法、乘法和逆矩阵(Inverse Matrix)等,用于计算模型参数。特征值(Eigenvalues)和特征向量(Eigenvectors)&…

向量数据库PGVECTOR安装

文章目录 前提向量数据库介绍PGVECTOR安装1、pgvector下载2、编译安装3、创建vector扩展 前提 已经安装好了pg14版本。 其他版本也可以。 pg安装教程:https://blog.csdn.net/yushaoyyds/article/details/138855306?spm1001.2014.3001.5502 向量数据库介绍 向量数…

头歌网络安全(11.12)

头歌禁止复制解决 必须先下篡改猴!!!! 头歌复制助手 Educoder Copy Helperhttps://scriptcat.org/zh-CN/script-show-page/1860 Java生成验证码 第1关:使用Servlet生成验证码 任务描述 本关任务:使用se…

技术栈1:nginx基础入门

目录 1.nginx概述 2.正向代理与反向代理 3.负载均衡 4.动静分离 5.nginx反向代理配置 1.nginx概述 Nginx (engine x)是一个高性能的HTTP和反向代理Web服务器,同时也提供了IMAP/POP3/SMTP服务。Nginx是由伊戈尔赛索耶夫为俄罗斯访问量第二的Rambler.ru站点开发…

自建CDN是否适合您的企业?

在信息化加速发展的今天,CDN(内容分发网络)对于优化内容传输速度、提升用户体验的重要性已不容忽视。企业在选择CDN方案时,常常面临两个选择:自建CDN或租用CDN服务。自建CDN让企业拥有高度的自主权和灵活性&#xff0c…