二十五:如何“合法”地跨域访问?

跨域访问(Cross-Origin Resource Sharing,简称CORS)是现代Web开发中常见的一种技术需求。由于浏览器的同源策略(Same-Origin Policy),不同域名、协议或端口之间的资源无法直接交互,这对前端开发者带来了挑战。然而,通过合法的跨域访问技术,开发者可以绕过这些限制,安全地进行跨域请求。本文将介绍如何合法地实现跨域访问,并解释相关的技术和最佳实践。

1. 什么是跨域访问?

跨域访问指的是在一个域名的网页中,通过JavaScript向另一个域名的服务器发起请求,获取资源。由于浏览器的同源策略,来自不同源(即不同域名、协议、端口的组合)的网页无法直接相互访问数据。这种策略是为了保护用户的隐私和安全,避免恶意网站窃取用户数据。

示例:
  • 网页 https://www.example.com 试图从 https://api.example.com 请求数据。
  • 网页 https://www.example.com 试图从 https://api.different.com 请求数据。

在同源策略下,第一个请求是允许的,因为它们属于相同的域,但第二个请求就会被阻止。

2. 合法的跨域访问方法

要合法地实现跨域访问,必须采用一些方法来解决同源策略的限制。以下是几种常用的合法跨域访问技术:

2.1 跨域资源共享(CORS)

CORS(Cross-Origin Resource Sharing)是最常见的跨域访问解决方案。它是一个浏览器端的机制,通过在服务器的响应头中添加特定的跨域信息,允许客户端(通常是JavaScript代码)跨域访问服务器资源。

CORS 的工作原理:
  1. 简单请求(Simple Requests):浏览器发起跨域请求时,会检查请求是否符合“简单请求”的标准。符合条件时,浏览器会自动发送带有CORS头部的请求。
  2. 预检请求(Preflight Request):对于一些复杂请求(如使用PUT、DELETE方法,或自定义头部的请求),浏览器会先发送一个OPTIONS请求来确认目标服务器是否允许跨域访问。如果服务器允许,则继续发送实际的请求。
CORS 响应头:
  • Access-Control-Allow-Origin:指定哪些源可以访问资源。例如,Access-Control-Allow-Origin: * 允许所有来源的请求,或指定特定域名如 Access-Control-Allow-Origin: https://www.example.com
  • Access-Control-Allow-Methods:允许哪些HTTP方法进行跨域访问,例如 GET, POST, PUT, DELETE 等。
  • Access-Control-Allow-Headers:允许跨域请求中携带哪些自定义头部。
  • Access-Control-Allow-Credentials:是否允许携带用户凭证(如cookie),Access-Control-Allow-Credentials: true
CORS 的优点:
  • 安全性较高,由服务器决定是否允许跨域访问。
  • 支持多种HTTP方法和自定义请求头。
示例:
Access-Control-Allow-Origin: https://www.example.com
Access-Control-Allow-Methods: GET, POST, PUT
Access-Control-Allow-Headers: Content-Type, Authorization

2.2 JSONP(JSON with Padding)

JSONP是一种绕过同源策略的技术,允许从服务器获取JSON格式的数据。它通过动态创建<script>标签来进行跨域请求。由于<script>标签不受同源策略的限制,因此可以跨域加载脚本。

使用方式:
  1. 在请求中传递一个回调函数名,服务器返回一个调用该回调函数的JavaScript代码,代码中包含数据。
  2. 浏览器执行返回的JavaScript代码,并通过回调函数处理数据。
优点:
  • 实现简单,可以用于GET请求。
  • 不依赖CORS,适用于不支持CORS的浏览器或旧浏览器。
缺点:
  • 只能处理GET请求,不能进行其他HTTP方法的请求。
  • 安全性较差,因为它允许执行服务器返回的JavaScript代码,可能会导致XSS攻击。
示例:
<script src="https://api.example.com/data?callback=handleResponse"></script>
function handleResponse(data) {console.log(data);
}

2.3 代理服务器

如果服务器不支持CORS或JSONP,另一种常见的做法是使用代理服务器。通过在前端和目标服务器之间设置一个代理,前端请求可以先发送到自己的服务器,代理服务器再向目标服务器发起请求,最后将结果返回给前端。

代理的工作原理:
  1. 前端发送请求到本地代理服务器。
  2. 代理服务器再发送请求到目标服务器。
  3. 目标服务器返回数据给代理服务器,代理服务器将数据转发给前端。
优点:
  • 可以绕过跨域限制,支持任何HTTP方法。
  • 可以在代理服务器中添加安全性验证、缓存等功能。
示例(Node.js代理):
const express = require('express');
const axios = require('axios');
const app = express();app.get('/api', async (req, res) => {try {const response = await axios.get('https://api.example.com/data');res.json(response.data);} catch (error) {res.status(500).send('Error fetching data');}
});app.listen(3000, () => {console.log('Proxy server running on http://localhost:3000');
});

2.4 WebSocket

WebSocket是一种基于TCP的协议,允许在客户端和服务器之间建立持久的双向通信连接。它不像HTTP请求那样受同源策略的限制,因此可以用于跨域通信。

优点:
  • 支持双向实时通信。
  • 不受同源策略限制,可以跨域连接。
示例:
const socket = new WebSocket('wss://example.com/socket');
socket.onopen = function() {console.log('WebSocket connected');
};
socket.onmessage = function(event) {console.log('Message from server: ', event.data);
};

3. 跨域访问的安全性问题

虽然有多种合法的跨域技术,但跨域访问涉及到安全性问题,尤其是CORS、代理服务器和WebSocket等技术可能带来以下风险:

  • 跨站请求伪造(CSRF):恶意网站可能利用已登录用户的身份发起请求,危害用户数据安全。
  • 数据泄露:如果CORS配置不当,可能会允许不可信的第三方站点访问敏感数据。
  • XSS攻击:尤其是JSONP,可能允许恶意代码执行,从而导致XSS攻击。

因此,跨域访问时需要格外小心,确保正确配置CORS响应头,并对所有来自外部的请求进行严格验证和控制。

4. 总结

合法的跨域访问是Web开发中不可避免的问题,常见的解决方案包括CORS、JSONP、代理服务器和WebSocket等。每种方法都有其适用场景和优缺点,开发者应根据实际需求选择合适的跨域访问方式。在实现跨域时,务必注意安全性,确保数据不被滥用或泄露。

目录:

一:浏览器发起 HTTP 请求的典型场景_浏览器如何发送用户名密码的请求-CSDN博客

二:基于ABNF语义定义的HTTP消息格式-CSDN博客     

三:网络为什么要分层:OSI模型与TCP/IP模型-CSDN博客   

四:HTTP的诞生:它解决了哪些网络通信难题?-CSDN博客      

五:评估Web架构的七大关键属性-CSDN博客          

六:从五种架构风格推导出HTTP的REST架构-CSDN博客          

七:如何用Chrome的Network面板分析HTTP报文-CSDN博客      

八:URI的基本格式及其与URL的区别-CSDN博客      

九:为什么要对URI进行编码?-CSDN博客      

十:详解HTTP的请求行-CSDN博客     

十一:HTTP 状态码详解:解读每一个响应背后的意义-CSDN博客      

十二:HTTP错误响应码:理解与应对-CSDN博客      

十三:如何管理跨代理服务器的长短连接?-CSDN博客     

十四:HTTP消息在服务器端的路由-CSDN博客     

十五:代理服务器转发消息时的相关头部-CSDN博客   

十六:请求与响应的上下文-CSDN博客   

十七:Web内容协商与资源表述-CSDN博客  

十八:HTTP包体的传输方式(1):定长包体-CSDN博客  

十九:HTTP包体的传输方式(2):不定长包体-CSDN博客

二十:HTML Form表单提交时的协议格式-CSDN博客

二十一:断点续传与多线程下载是如何做到的?-CSDN博客

二十二:Cookie的格式与约束-CSDN博客

二十三:Session及第三方Cookie的工作原理-CSDN博客

二十四:浏览器为什么要有同源策略?-CSDN博客 

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

计算机网络的功能

目录 信息交换 资源共享 分布式处理 可靠性增强 集中管理 信息交换 计算机网络最基本的功能之一是允许不同设备之间的数据通信。这包括电子邮件的发送和接收、即时消息的传递、文件传输等。通过网络&#xff0c;用户可以轻松地与全球各地的其他人进行沟通和协作。 信息交…

【C++习题】15.滑动窗口_串联所有单词的子串

文章目录 题目链接&#xff1a;题目描述&#xff1a;解法C 算法代码&#xff1a;图解 题目链接&#xff1a; 30. 串联所有单词的子串 题目描述&#xff1a; 解法 滑动窗口哈希表 这题和第14题不同的是&#xff1a; 哈希表不同&#xff1a;hash<string,int>left与right指…

NUMA架构及在极速网络IO场景下的优化实践

NUMA技术原理 NUMA架构概述 随着多核CPU的普及&#xff0c;传统的对称多处理器&#xff08;SMP&#xff09;架构逐渐暴露出性能瓶颈。为了应对这一问题&#xff0c;非一致性内存访问&#xff08;NUMA, Non-Uniform Memory Access&#xff09;架构应运而生。NUMA架构是一种内存…

论文笔记(五十七)Diffusion Model Predictive Control

Diffusion Model Predictive Control 文章概括摘要1. Introduction2. Related work3. 方法3.1 模型预测控制3.2. 模型学习3.3. 规划&#xff08;Planning&#xff09;3.4. 适应 4. 实验&#xff08;Experiments&#xff09;4.1. 对于固定奖励&#xff0c;D-MPC 可与其他离线 RL…

Android 13 Aosp Settings Android Studio版本

Android 13 Aosp Settings Android Studio版本 Settings相关源码 Settings https://android.googlesource.com/platform/packages/apps/Settings/+/refs/heads/android13-release SettingsIntelligence https://android.googlesource.com/platform/packages/apps/SettingsIn…

oracle 创建只可以查询权限用户+sqldeveloper如何看到对应表

声明 申明部分是从其他csdn用户哪里复制的&#xff0c;只是自己操作后发现无法达到我最后的预期&#xff0c;所以关闭忘记是看的那篇了&#xff0c;如果有侵权请见谅&#xff0c;联系我删除谢谢。 好了&#xff0c;故事的开始是我最近删投产表了。没错职业黑点&#xff0c;清…

比特币libsecp256k1中safegcd算法形式化验证完成

1. 引言 比特币和其他链&#xff08;如 Liquid&#xff09;的安全性取决于 ECDSA 和 Schnorr 签名等数字签名算法的使用。Bitcoin Core 和 Liquid 都使用名为 libsecp256k1 的 C 库来提供这些数字签名算法&#xff0c;该库以其所运行的椭圆曲线命名。这些算法利用一种称为modu…

软件测试丨Pytest生命周期与数据驱动

Pytest的生命周期概述 Pytest 是一个强大的测试框架&#xff0c;提供了丰富的特性来简化测试执行。它的生命周期包括多个阶段&#xff0c;涉及从准备测试、执行测试到报告结果的完整流程。因此&#xff0c;理解Pytest的生命周期将帮助我们更好地设计和管理测试用例。 开始阶段…

15分钟做完一个小程序,腾讯这个工具有点东西

我记得很久之前&#xff0c;我们都在讲什么低代码/无代码平台&#xff0c;这个概念很久了&#xff0c;但是&#xff0c;一直没有很好的落地&#xff0c;整体的效果也不算好。 自从去年 ChatGPT 这类大模型大火以来&#xff0c;各大科技公司也都推出了很多 AI 代码助手&#xff…

Python学习——猜拳小游戏

import random player int(input(“请输入&#xff1a;剪刀 0&#xff0c;石头 1&#xff0c;布2”)) computer random.randint(0,2)# print(“玩家输入的是%d&#xff0c;电脑输入的是%d” %(player,computer)) 用于测试 if (player 0) and (computer 0) or (player 1) a…

从零样本到少样本学习:一文读懂 Zero-shot、One-shot 和 Few-shot 的核心原理与应用!

爆款标题&#xff1a; 《从零样本到少样本学习&#xff1a;一文读懂 Zero-shot、One-shot 和 Few-shot 的核心原理与应用&#xff01;》 正文&#xff1a; 在自然语言处理&#xff08;NLP&#xff09;领域&#xff0c;Zero-shot、One-shot 和 Few-shot 学习已经成为衡量大语言…

Kafka知识体系

一、认识Kafka 1. kafka适用场景 消息系统&#xff1a;kafka不仅具备传统的系统解耦、流量削峰、缓冲、异步通信、可扩展性、可恢复性等功能&#xff0c;还有其他消息系统难以实现的消息顺序消费及消息回溯功能。 存储系统&#xff1a;kafka把消息持久化到磁盘上&#xff0c…

JVM调优篇之JVM基础入门AND字节码文件解读

目录 Java程序编译class文件内容常量池附录-访问标识表附录-常量池类型列表 Java程序编译 Java文件通过编译成class文件后&#xff0c;通过JVM虚拟机解释字节码文件转为操作系统执行的二进制码运行。 规范 Java虚拟机有自己的一套规范&#xff0c;遵循这套规范&#xff0c;任…

@sun.misc.Contended

某个类有以下两个属性 volatile int a; volatile int b; int为4字节&#xff0c;两个int为8字节&#xff0c;一个缓存行大小为64字节 故一旦缓存行a失效了&#xff0c;但是b没失效&#xff0c;会连带着b一起失效&#xff0c;因为失效最小的单位就是一个缓存行 这样子会导致效率…

【Petri网导论学习笔记】Petri网导论入门学习(十一) —— 3.3 变迁发生序列与Petri网语言

目录 3.3 变迁发生序列与Petri网语言定义 3.4定义 3.5定义 3.6定理 3.5例 3.9定义 3.7例 3.10定理 3.6定理 3.7 有界Petri网泵引理推论 3.5定义 3.9定理 3.8定义 3.10定义 3.11定义 3.12定理 3.93.3 变迁发生序列与Petri网语言 对于 Petri 网进行分析的另一种方法是考察网系统…

Flink--API 之Transformation-转换算子的使用解析

目录 一、常用转换算子详解 &#xff08;一&#xff09;map 算子 &#xff08;二&#xff09;flatMap 算子 &#xff08;三&#xff09;filter 算子 &#xff08;四&#xff09;keyBy 算子 元组类型 POJO &#xff08;五&#xff09;reduce 算子 二、合并与连接操作 …

解锁Scala编程:深入文本分析与数据处理的艺术

引言&#xff1a; 在数据科学的世界里&#xff0c;Scala以其强大的并发能力和简洁的语法&#xff0c;成为处理大规模数据集的理想选择。本文将带您踏上一段Scala编程的探索之旅&#xff0c;从基础的文本分析到复杂的数据处理&#xff0c;每一步都精心设计&#xff0c;让您在实…

Top 10 Tools to Level Up Your Prompt Engineering Skills

此文章文字是转载翻译&#xff0c;图片是自已用AI 重新生成的。文字内容来自 https://www.aifire.co/p/top-10-ai-prompt-engineering-tools 供记录学习使用。 Introduction to AI Prompt Engineering AI Prompt Engineering 简介 1&#xff0c;Prompt Engineering 提示工程…

【RK3588 Linux 5.x 内核编程】-内核线程与读写自旋锁

内核线程与读写自旋锁 文章目录 内核线程与读写自旋锁1、读写自旋锁介绍2、Linux内核中的读写自旋锁2.1 初始化2.1.1 静态方法2.1.2 动态方法3、读写自旋锁加锁与解锁3.1 在用户上下文之间锁定3.1.1 读锁3.1.2 写锁3.2 下半部分之间的锁定3.3 在用户上下文和下半部分之间锁定3.…

Rust语言俄罗斯方块(漂亮的界面案例+详细的代码解说+完美运行)

tetris-demo A Tetris example written in Rust using Piston in under 500 lines of code 项目地址: https://gitcode.com/gh_mirrors/te/tetris-demo 项目介绍 "Tetris Example in Rust, v2" 是一个用Rust语言编写的俄罗斯方块游戏示例。这个项目不仅是一个简单…