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

跨域访问(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,一经查实,立即删除!

相关文章

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

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

论文笔记(五十七)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…

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

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

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

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

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

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

Kafka知识体系

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

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

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

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 提示工程…

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语言编写的俄罗斯方块游戏示例。这个项目不仅是一个简单…

Spring Boot 与 Spring Cloud Alibaba 版本兼容对照

版本选择要点 Spring Boot 3.x 与 Spring Cloud Alibaba 2022.0.x Spring Boot 3.x 基于 Jakarta EE&#xff0c;javax.* 更换为 jakarta.*。 需要使用 Spring Cloud 2022.0.x 和 Spring Cloud Alibaba 2022.0.x。 Alibaba 2022.0.x 对 Spring Boot 3.x 的支持在其发行说明中…

(免费送源码)计算机毕业设计原创定制:Java+ssm+JSP+Ajax SSM棕榈校园论坛的开发

摘要 随着计算机科学技术的高速发展,计算机成了人们日常生活的必需品&#xff0c;从而也带动了一系列与此相关产业&#xff0c;是人们的生活发生了翻天覆地的变化&#xff0c;而网络化的出现也在改变着人们传统的生活方式&#xff0c;包括工作&#xff0c;学习&#xff0c;社交…

Ubuntu Opencv 源码包安装

说明&#xff1a; ubuntu20.04 建议 使用 opencv-4.6.0版本 ubuntu18.04 建议 使用 opencv-4.5.2-版本 安装包准备 1、下载源码包 OpenCV官网 下载相关版本源码 Sources # 克隆方式 OpenCV 源码git clone https://github.com/opencv/opencv.gitcd opencvgit checkout 4.5.2 …

Linux 下自动化之路:达梦数据库定期备份并推送至 GitLab 全攻略

目录 环境准备 生成SSH 密钥对 数据库备份并推送到gitlab脚本 设置定时任务 环境准备 服务器要有安装达梦数据库&#xff08;达梦安装这里就不示例了&#xff09;&#xff0c;git 安装Git 1、首先&#xff0c;确保包列表是最新的&#xff0c;运行以下命令&#xff1a; …

<项目代码>YOLOv8 停车场空位识别<目标检测>

YOLOv8是一种单阶段&#xff08;one-stage&#xff09;检测算法&#xff0c;它将目标检测问题转化为一个回归问题&#xff0c;能够在一次前向传播过程中同时完成目标的分类和定位任务。相较于两阶段检测算法&#xff08;如Faster R-CNN&#xff09;&#xff0c;YOLOv8具有更高的…

Spring Boot 集成 Knife4j 的 Swagger 文档

在开发微服务应用时&#xff0c;API 文档的生成和维护是非常重要的一环。Swagger 是一个非常流行的 API 文档工具&#xff0c;可以帮助我们自动生成 RESTful API 的文档&#xff0c;并提供了一个友好的界面供开发者测试 API。本文将介绍如何在 Spring Boot 项目中集成 Knife4j …

微信小程序中会议列表页面的前后端实现

题外话&#xff1a;想通过集成腾讯IM来解决即时聊天的问题&#xff0c;如果含语音视频&#xff0c;腾讯组件一年5万起步&#xff0c;贵了&#xff01;后面我们改为自己实现这个功能&#xff0c;这里只是个总结而已。 图文会诊需求 首先是个图文列表界面 同个界面可以查看具体…

git(Linux)

1.git 三板斧 基本准备工作&#xff1a; 把远端仓库拉拉取到本地了 .git --> 本地仓库 git在提交的时候&#xff0c;只会提交变化的部分 就可以在当前目录下新增代码了 test.c 并没有被仓库管理起来 怎么添加&#xff1f; 1.1 git add test.c 也不算完全添加到仓库里面&…

【动手学电机驱动】STM32-FOC(8)MCSDK Profiler 电机参数辨识

STM32-FOC&#xff08;1&#xff09;STM32 电机控制的软件开发环境 STM32-FOC&#xff08;2&#xff09;STM32 导入和创建项目 STM32-FOC&#xff08;3&#xff09;STM32 三路互补 PWM 输出 STM32-FOC&#xff08;4&#xff09;IHM03 电机控制套件介绍 STM32-FOC&#xff08;5&…