为什么会有跨域问题,代理是怎么解决的?

news2024/12/22 12:12:44

📖 文章导航

    • 关于跨域问题
      • 同源策略
      • 跨域资源共享
    • 解决方案
      • 前端代理
      • 后端
      • 服务端代理


关于跨域问题

同源策略

同源策略(Same-origin policy)是浏览器中一个重要的安全策略,它用于限制不同源之间的资源交互。其目的是为了帮助阻隔恶意文档,减少可能被攻击的媒介。

同源的定义
同源三要素:协议 + 域名 + 端口

示例:https://www.baidu.com/index.html

网址是否同源描述
https://www.baidu.com/about.html只有路径不同
http://www.baidu.com/index.html协议不同 http
https://www.baibu.com/index.html很明显域名 (主机) 不同
https://www.baidu.com:8000/index.html端口号不同 http 默认是 80 端口

由于同源策略的存在,所以不同源之间资源加载存在跨域问题。

跨域问题只存在于浏览器中,APP、小程序中不存在

– HTML 标签中许多 src 属性是可以跨域请求的,比如 img script 等

跨域资源共享

跨域资源共享 (CORS, Cross Origin Resource Sharing) 是一种基于 HTTP 头的机制,该机制可以通过服务器指定能够访问它的源,这使浏览器允许这些源访问加载自己的资源。

当浏览器认为即将要执行的请求可能会对服务器造成不可预知的影响时,会在正式请求资源之前,先发送一个preflight 预检请求 (preflight 请求类型为 OPTIONS),根据服务器响应判断是否允许即将执行的请求。

响应头中通常包含这些信息:

Access-Control-Allow-Headers: Content-Type, Content-Length, Authorization, Accept, X-Requested-With
Access-Control-Allow-Origin: http://www.baidu.com
Access-Control-Allow-Methods: POST, GET, OPTIONS, DELETE
Access-Control-Max-Age: 86400

其中 Access-Control-Allow-Origin 就表示当前服务器允许的源,如果与当前源不匹配或不存在该字段,就会触发跨域错误。

解决方案

前面讲到跨域问题只存在于浏览器中,有几点需要理解:

  1. 在默认情况下,浏览器发送的跨域请求,实际上服务器是响应了的,只不过响应结果被浏览器拦截了,因为同源策略。细分的话有两种情况:
    1.简单请求:服务器处理并相应;
    2.复杂请求:浏览器会发送预检请求,服务器只是应答了预检请求,预检请求的响应结果被浏览器拦截,所以并未收到真正的业务请求,也就不会处理真实业务逻辑。

前端代理

以前端工程化为基础,忽略了 JSONP 等跨域解决方案

应用场景: 本地开发

前端代理是如何解决跨域问题的?
通过 node 中间件实现代理来转发我们的请求,由于 node 本身不受浏览器的限制,所以可以和服务器正常通讯。简单示意图如下:
在这里插入图片描述

webpack-dev-server
前端基于 webpack 进行打包的项目都会以 webpack-dev-server 来运行,前端可以在开发环境设置代理解决跨域问题:

devServer: {
  proxy: {
    '/api': {
      target: 'http://target.origin',
      changeOrigin: true, //是否跨域
      pathRewrite: { '^/api': '' }
    }
  }
}

vite
vite 与 webpack 的写法略有不同,更多写法可参考 Vite 官方中文文档

server: {
  proxy: {
    '/api': {
      target: 'http://target.origin',
      changeOrigin: true, //是否跨域
      rewrite: (path) => path.replace(/^\/api/, '')
    }
  }
}

后端

应用场景: 应用比较少吧,因为开发环境和生产环境部署时的源不相同,而且每次在不同的服务器部署时都需要改代码去调整允许访问的源也不现实。一般也不建议设为 *。

后端是如何解决跨域问题的?
通过配置允许的源,在响应头中将请求源添加到 Access-Control-Allow-Origin 中,浏览器同源策略就能判定为同源请求。不同框架的 API 可能不同,但方法都是一样的,下面是 express 的示例:

// 判断当前源是否在允许列表内
const isAllowedOrigin = (origin) => {
  // 同时设定多个允许的源
  const allowedOrigins = ['http://localhost:3300', 'http://127.0.0.1:3300'];
  return allowedOrigins.includes(origin);
};

app.all('*', function (req, res, next) {
  const { origin } = req.headers;
  if (!isAllowedOrigin(origin)) {
    return;
  }
  res.header('Access-Control-Allow-Origin', origin);
  next();
});

服务端代理

应用场景: 线上部署
Nginx 反向代理
前端分离项目部署通常也都需要解决跨域问题,因为前后端项目部署在不同的端口,甚至不同的服务器上。通过 Nginx 转发请求,不会触发同源策略。

{
   server {
    listen 3000;
    server_name localhost;

	# 前端部署配置
    location / {
        root /var/www/app; # 配置应用的文件夹
        index index.html index.htm;
        try_files $uri $uri/ /index.html;
    }
    
    # 代理后端 API 的配置
    location /api/ { # 用于转发的后端地址标志
        proxy_pass http://192.168.0.1:8080/;# 后端部署的真实地址
    }
}

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

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

相关文章

由浅入深,一起来刷Java高级开发岗面试指南,面试必定无忧!

前言 我只想面个CV工程师,面试官偏偏让我挑战造火箭工程师,加上今年这个情况更是前后两男,但再难苟且的生活还要继续,饭碗还是要继续找的。在最近的面试中我一直在总结,每次面试回来也都会复盘,下面是我根…

Dubbo之SpringBoot启动源码详解

需要前置知识,了解spring源码,springboot自动加载机制等 DubboBootstrap启动 详细信息可看 学习Dubbo源码需要了解的基础内容源码详解 DubboBootstrap 启动所需要的信息 添加应用程序配置添加注册中心配置添加协议配置添加服务配置启动 SpringBoot启…

广东MES系统实施过程中的要点和难点

MES系统已经成为企业目前实施的焦点。但是MES系统又分为很多的种类,对企业之间则是很难选择的,因为大部分的企业对MES系统的要点和难点并不清楚,而今天就让先达盈致的小编带大家了解一下广东MES系统实施过程中的要点和难点。MES系统是实现企业…

戴尔T5810电脑 Hackintosh 黑苹果efi引导文件

原文来源于黑果魏叔官网,转载需注明出处。硬件型号驱动情况主板戴尔T5810,C610/612芯片处理器英特尔至强E5-2620 v3已驱动内存12 GB已驱动硬盘500GB WD Blue Solid State Drive & 2TB Seagate Mobile Hard Drive (Upgraded)已驱动显卡RX 570 4Gb已驱…

october-cms

环境准备 靶机链接:百度网盘 请输入提取码 提取码:3e4s 虚拟机网络链接模式:桥接模式 攻击机系统:kali linux 2021.1 信息收集 1.探测目标靶机ip。 2.探测靶机开放端口和服务情况。 漏洞探测 1.访问网页 2.用dirsearch扫描…

用javascript分类刷leetcode15.链表(图文视频讲解)

链表操作如下图: 动画过大,点击查看 时间复杂度: prepend: O(1)append: 如果已知尾节点O(1),否则需要遍历到尾节点,然后加入新节点O(n)insert: 插入到已知节点的后面O(1),需要先查找后插入O(n)lookup: O…

【STM32笔记】__WFI();进入不了休眠的可能原因

【STM32笔记】__WFI();进入不了休眠的可能原因 【STM32笔记】低功耗模式配置及避坑汇总 前文: blog.csdn.net/weixin_53403301/article/details/128216064 【STM32笔记】HAL库低功耗模式配置(ADC唤醒无法使用、低功耗模式无法烧录解决方案)…

Outlook邮箱注册教程 不信你看完还不懂

Outlook作为Microsoft Office家族的办公软件套装之一,关联着很多微软的其他产品。而且Outlook是欧美地区认可度比较高的,不仅可以用于一些境外联络还可以拿来注册Instagram、Twitter、Facebook等各种社交媒体平台。龙哥在这里就给大家出一份详细的Outloo…

Python打包调试问题解决

使用pyinstaller打包,发现问题:代码运行时调试的结果不一致代码中设定的图标打包后没有显示出来打包代码程序test.py为入口函数main()所在的文件pyinstaller -F -w -i test.ico test.py 不会出现控制台,图标为test.ic…

电源大事,阻抗二字

作者:一博科技高速先生成员 姜杰PCB设计时,我们通常会控制走线的特征阻抗;电源设计时,又会关注电源分配系统(PDN)的交流阻抗,虽然都是阻抗,一个是信号的通道要求,一个是电…

电子标签拣货系统——外接供电版

Power_DC24v 型号:Power_DC24v24V电源适配器级联线:长30cm直径:15mmCK_Wire_V1 型号:CK_Wire_V1连接电源适配器级联线:长30cm公线:长宽厚 14*11*9mm母线:长宽厚 13*5.5*3mmCK_Wire_V2 型号&…

安卓玩机搞机-----没有第三方包 刷写第三方各种GSI系统 体验非官方系统

很多安卓友友热衷与刷这些各种第三方包体验。但有个别机型第三方资源较少。而且有的机型要体验非官方系统却没有对应系统的第三方包。那可以体验下刷gsi系统来畅玩。今天的帖子就聊聊GSI系统的各种刷写操作和对应的故障解析、 💔💔💔&#x…

spring cloud(二)----------------Eureka注册中心环境搭建

一、首先创建一个没有架骨的maven主项目 点击下一步创建 创建完成后在maven主项目下删除src并且创建四个maven副项目分别叫: demospringcloud-api--------连接实例 demospringcloud-cosumer---------消费类 demospringcloud-eureka---------注册类 demospringc…

机器学习:基于支持向量机(SVM)进行人脸识别预测

机器学习:基于支持向量机(SVM)进行人脸识别预测 文章目录机器学习:基于支持向量机(SVM)进行人脸识别预测一、实验目的二、实验原理三、实验环境四、实验内容五、实验步骤1.准备数据2.业务理解3.数据理解4.数…

java3月train笔记

java笔记 day01 一、jdk和idea下载及安装(一般不建议装C盘): jdk:java开发环境 idea:开发工具(软件),用来编写代码的 苍老师文档服务器:doc.canglaoshi.org jdk下载&…

JavaEE|网络编程之套接字 TCP

文章目录一、ServerSocket API构造方法常用方法二、Socket API构造方法常用方法注意事项三、TCP中的长短连接E1:一发一收(短连接)E2:请求响应(短连接)E3:多线程下的TCP回响服务器说明:这部分说实话有点懵&a…

SrpingBoot拦截器

一、拦截器原理 根据当前请求,进入到 HandlerExecutionChain(可以处理请求的 handler 以及 handler 的所有拦截器)根据顺序执行所有拦截器的 preHandle() 方法如果当前拦截器的 preHandler() 方法返回 true,则执行下一个拦截器的 preHandler() 方法如果当…

Java常用框架(一)

思维导图 常见知识点 一、SpringBoot 1.简单介绍一下Spring及其优缺点 1.1 概念 重量级企业开发框架EJB的替代品,通过依赖注入、面向切面编程,使用简单Java对象POJO为企业Java开发提供了相对简单的方法。 1.2 优缺点 1.2.1 优点 组件代码轻量级 …

高并发架构 第一章大型网站数据演化——核心解释与说明。大型网站技术架构——核心原理与案例分析

大型网站架构烟花发展历程1.1.1初始阶段的网站构架1.1.2应用服务和数据服务分离1.1.3使用缓存改善网络性能1.1.4使用应用服务器集群改善网站的并发处理能力1.1.5数据库读写分离1.1.6使用反向代理和cdn加速网站相应1.1.1初始阶段的网站构架 大型网站都是由小型网站一步步发展而…

音视频基础之音频常见名词

采样频率 每秒钟采样的点的个数。常用的采样频率有: 22000(22kHz): 无线广播。 44100(44.1kHz):CD音质。 48000(48kHz): 数字电视,DVD。 96000&am…