介绍 HTTP 请求如何实现跨域

news/2025/1/23 19:29:46/
http://www.w3.org/2000/svg" style="display: none;">

以下是关于 HTTP 请求如何实现跨域的详细介绍:

一、什么是跨域

跨域是指一个域下的文档或脚本试图去请求另一个域下的资源,这是由于浏览器的同源策略所导致的。同源策略是浏览器的一个安全机制,它要求协议、域名和端口都相同,否则会被认为是跨域请求。例如,http://example.comhttps://example.com 发送请求,或者 http://example.comhttp://api.example.com 发送请求,都属于跨域请求。

二、实现跨域的方法

1. CORS(跨域资源共享)

CORS 是一种现代的跨域解决方案,它允许服务器声明哪些源可以访问该资源。在服务器端,通过设置响应头来实现。

服务器端设置示例(以 Node.js 和 Express 为例):

const express = require('express');
const app = express();app.use((req, res, next) => {// 允许所有源进行跨域访问res.setHeader('Access-Control-Allow-Origin', '*'); // 允许的请求方法res.setHeader('Access-Control-Allow-Methods', 'GET, POST, PUT, DELETE'); // 允许的请求头res.setHeader('Access-Control-Allow-Headers', 'Content-Type, Authorization'); next();
});app.get('/data', (req, res) => {res.send('This is some data');
});app.listen(3000, () => {console.log('Server is running on port 3000');
});

解释:

  • res.setHeader('Access-Control-Allow-Origin', '*')* 表示允许任何源进行跨域访问,也可以指定具体的源,如 http://example.com
  • res.setHeader('Access-Control-Allow-Methods', 'GET, POST, PUT, DELETE'):定义允许的 HTTP 请求方法。
  • res.setHeader('Access-Control-Allow-Headers', 'Content-Type, Authorization'):定义允许的请求头。
2. JSONP(JSON with Padding)

JSONP 是一种比较古老的跨域解决方案,它利用 <script> 标签不受同源策略限制的特点。它需要服务器端的配合,服务器端将数据包装在一个函数调用中返回。

客户端代码示例:

<script>function handleData(data) {console.log(data);}
</script>
<script src="http://api.example.com/data?callback=handleData"></script>

服务器端代码示例(以 Node.js 为例):

const http = require('http');http.createServer((req, res) => {const callback = req.url.split('?')[1].split('=')[1];const data = { message: 'Hello from server' };res.writeHead(200, {'Content-Type': 'application/javascript'});// 将数据包装在回调函数中返回res.end(`${callback}(${JSON.stringify(data)})`); 
}).listen(3000);

解释:

  • 客户端定义一个 handleData 函数。
  • 服务器端接收 callback 参数,将数据作为参数传递给该函数,并将函数调用作为响应返回。
3. 代理服务器

使用代理服务器可以绕过同源策略,因为客户端请求的是同域的代理服务器,然后代理服务器去请求另一个域的资源。

客户端代码示例(以 jQuery 为例):

<script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
<script>$.ajax({url: '/proxy',type: 'GET',success: function(data) {console.log(data);}});
</script>

服务器端代码示例(以 Node.js 和 Express 为例):

const express = require('express');
const request = require('request');
const app = express();app.get('/proxy', (req, res) => {request('http://api.example.com/data', (error, response, body) => {if (!error && response.statusCode == 200) {res.send(body);}});
});app.listen(3000, () => {console.log('Server is running on port 3000');
});

解释:

  • 客户端向 /proxy 发送请求,这是同域的。
  • 服务器端的 /proxy 路由接收到请求后,向真正的目标地址 http://api.example.com/data 发送请求,并将结果返回给客户端。
4. 反向代理(以 Nginx 为例)

在服务器端配置反向代理,将跨域请求转发到目标服务器。

Nginx 配置示例:

server {listen 80;server_name example.com;location /api/ {proxy_pass http://api.example.com/;proxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr;}
}

解释:

  • 当客户端请求 http://example.com/api/ 时,Nginx 会将请求转发到 http://api.example.com/,对于客户端来说,请求的是同域的资源,从而避免了跨域问题。

三、总结

  • CORS 是目前最常用的跨域解决方案,它提供了更灵活和安全的跨域访问控制,适合现代的 Web 开发。
  • JSONP 有一定的局限性,仅适用于 GET 请求,且存在安全风险。
  • 代理服务器和反向代理是通过服务器端转发请求,在某些场景下比较实用,但会增加服务器的负担。根据不同的需求和场景,可以选择不同的跨域解决方案。

http://www.ppmy.cn/news/1565561.html

相关文章

MyBatis最佳实践:参数详解

第一章&#xff1a;MyBatis 参数详解 parameterType&#xff1a; 简单数据类型&#xff1a; int double String Long 简单的写法&#xff1a; Java.lang.Integer > int、Int、integer、Integer 都可以&#xff0c;框架提供简写的方式 POJO(JavaBean 实体类)&#xff1a;对…

细说STM32F407单片机电源低功耗StandbyMode待机模式及应用示例

目录 一、待机模式基础知识 1、进入待机模式 2、待机模式的状态 3、退出待机模式 二、待机模式应用示例 1、示例功能和CubeMX项目设置 &#xff08;1&#xff09; 时钟 &#xff08;2&#xff09; DEBUG、LED1、KeyRight、USART6、CodeGenerator &#xff08;3&#x…

[STM32 HAL库]串口空闲中断+DMA接收不定长数据

一、空闲中断 STM32的串口具有空闲中断&#xff0c;什么叫做空闲呢&#xff1f;如何触发空闲中断呢&#xff1f; 空闲&#xff1a;串口发送的两个字符之间间隔非常短&#xff0c;所以在两个字符之间不叫空闲。空闲的定义是总线上在一个字节的时间内没有再接收到数据。触发条件…

【项目推荐】LeNet-MNIST纯NumPy实现:从零理解神经网络计算过程

项目地址&#xff1a;cakeinfer_fnumpy 项目介绍 这是一个使用纯NumPy实现的LeNet-5卷积神经网络框架&#xff0c;专注于帮助开发者深入理解神经网络的计算过程。项目的特点是&#xff1a; 纯NumPy实现&#xff0c;无深度学习框架依赖&#xff08;并且使用numpy也不会导致过于…

分布式ID介绍实现方案

分布式 ID 介绍 什么是 ID&#xff1f; 日常开发中&#xff0c;我们需要对系统中的各种数据使用 ID 唯一表示&#xff0c;比如用户 ID 对应且仅对应一个人&#xff0c;商品 ID 对应且仅对应一件商品&#xff0c;订单 ID 对应且仅对应一个订单。 我们现实生活中也有各种 ID&a…

vue2:为el-form-item的label设置背景色

要实现如下图所示,将部分label的背景色设置为灰色,查了几种方式都不起作用,最后使用插槽实现,记录如下。 <el-form-item label="所属模块:" prop="moduleUnid"><span slot="label"><span class="grey-label">所…

联德胜w801开发板(四)实现腾讯云mqtt的订阅和发布

一、开发准备 在设备开发这里我们就能看到物模型的topic&#xff0c;跟之前用stm32esp8266一样 附上之前的链接&#xff1a; STM32ESP8266连接腾讯IOT上传数据(四)_stm32通过esp8266上传数据到云平台-CSDN博客https://blog.csdn.net/Try1harder/article/details/134914027?…

代码随想录算法训练营day32

代码随想录算法训练营 —day32 文章目录 代码随想录算法训练营前言一、动态规划理论基础二、509. 斐波那契数动态规划动态规划优化空间版递归法 三、70. 爬楼梯动态规划动态规划空间优化 746. 使用最小花费爬楼梯动态规划空间优化 总结 前言 今天是算法营的第32天&#xff0c…