跨域问题的原理及解决方法

news2025/3/1 9:34:39

一.同源策略

如果没有进行特殊处理,我们在进行前后端联调的时候游览器会发生报错:

这是因为请求被同源策略被阻止,浏览器出于安全的考虑,使用XMLHttpRequest对象发起HTTP请求(异步请求)时必须遵守同源策略,否则就是跨域的HTTP请求,默认情况下是被禁止的。

那什么是同源策略呢?

同源策略(Same-Origin Policy),是一个web安全的基础原则。

【1】同源

什么是同源呢?指的是协议(如HTTP或HTTPS)、域名和端口号完全相同才算同源。

【2】跨域

从一个地址请求另一个地址,如果协议、主机、端口三者全部一致则不属于跨域(CORS--cross origin resource share 跨域资源共享),否则有一个不一致就是跨域请求,即不同源就是跨域。

【3】同源策略

而跨域的请求如果没对服务端做特殊处理,默认情况下游览器的请求是无法访问成功的。这就是游览器的同源策略。【同源策略要求在浏览器中运行的脚本只能访问和自身来源相同的文档或脚本】

在游览器中进行前后端联调的时候,本地的端口号与游览器中网页的协议一致,主机一致,但是端口号不一致,所以就会请求接口服务失败。这就是违反了同源策略,产生了跨域问题。所以游览器请求本地接口会失败。

注:为什么Postman没有跨域问题呢?因为Postman不是游览器,没有同源策略。

二.跨域请求的原理

在普通的跨域请求中(非简单请求),浏览器会先发送一个 OPTIONS 请求,该请求称为预检请求(preflight request),用来检查是否允许跨域访问。服务器收到预检请求后,根据请求中的头部信息进行判断,并返回相应的响应头,表示是否允许跨域访问。如果服务器返回的响应头中包含了允许跨域的信息(返回Access-Control-Allow-Origin 头信息),浏览器才会发送实际的跨域请求。

如果服务器没有正确设置响应头,或者返回的响应头中不包含允许跨域的信息,浏览器会拦截跨域请求,导致请求失败。

另外,需要注意的是浏览器的同源策略限制只存在于浏览器环境中。只有游览器才有跨域请求,如果在服务器端进行跨域请求,是不受同源策略限制的。

同源策略的作用是防止恶意网站通过在其页面中注入恶意脚本并获取其他来源的数据,防止跨站点脚本攻击(Cross-Site Scripting,XSS)、跨站点请求伪造(Cross-Site Request Forgery,CSRF)等安全问题的发生。

三.解决跨域问题的方法

那我们怎么让跨域请求成功发送呢?

1.JSONP--了解一下

通过script标签的src属性进行跨域请求,如果服务端要响应内容则首先读取请求参数callback的值,callback是一个回调函数的名称,服务端读取callback的值后将响应内容通过调用callback函数的方式告诉请求方。如下图:

2.添加响应头--常用

服务端在响应头添加 Access-Control-Allow-Origin:*,这样浏览器才会发送实际的跨域请求

原理:

实现:

【1】添加@CrossOrigin注解

既可以用在controller层方法上,表示让这个controller层的接口允许跨域,也可以用在controller层的该类中所有接口允许跨域

【2】在springboot中添加跨域配置类

(实现的原理就是在响应头添加Access-Control-Allow-Origin)

@Configuration
public class CorsConfig implements WebMvcConfigurer {
    @Override
    public void addCorsMappings(CorsRegistry registry){
        //设置允许跨域的路径
        registry.addMapping("*")
                //是否允许cookie
                .allowCredentials(true)
                //设置允许的请求方式
                .allowedMethods("GET","POST","DELETE","PUT")
                //设置允许的header属性
                .allowedHeaders("*")
                //跨域允许时间
                .maxAge(3600);
    }
}

3.通过nginx代理跨域

简单说以前是直接访问服务器,现在是先访问nginx再由nginx访问服务器。nginx相当于代理,因为nginx不是游览器,所以没有跨域的问题,通过这样子就解决了跨域的问题。

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

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

相关文章

数据库基础知识以及MySQL简介

关于MySQL的读法 MySQL如何发音?在国内MySQL发音有很多种,Oracle官方文档说他们念作 My sequal[si:kwəl]。 数据库基本概念 数据 数据(Data)是指对客观事物进行描述并可以鉴别的符号,这些符号是可识别的、抽象的。它…

W5100S_EVB_PICO快速入门之MQTT篇(十二)

目录 1. 前言 2. MQTT介绍 2.1 什么是mqtt? 2.2 特点 2.3 应用场景 2.4 MQTT协议实现方式 3. 硬件及接线方式 3.1 硬件准备 3.2 硬件介绍 3.3 接线图 4. 测试 4.1 MQTT测试流程图 4.2 相关代码 4.3 测试现象 5. 相关链接: 1. 前言 随着物…

C++,名称空间、运算符重载、模板/泛型

目录 一、名称空间 二、重载运算符 三、模板/泛型 一、名称空间 C中名称空间可以区别同名C风格函数、同名C风格全局变量、同名类。名称空间还可以无限嵌套。 namespace ns1 { ..... namespace ns2 { ..... } } 同一个名称空间名字可以多处书写,比如,在demo1.h中…

腾讯云最新优惠活动有哪些?活动入口在哪里?

腾讯云作为国内知名的云计算服务提供商,为了吸引用户,经常推出各种优惠活动。以下是近期腾讯云的一些优惠活动及其入口: 一、腾讯云新用户优惠券【点此领取】 腾讯云新用户专属大礼包,无门槛领取总价值高达2860元代金券&#xff…

postmain 存储接口返回值

1、postmain 存储接口返回值 //把json字符串转化为对象 var dataJSON.parse(responseBody);//获取data对象的utoken值。 var tokendata.data;//设置成全局变量 pm.globals.set("webToken", token); 2、固定参数设置

RocketMQ —消息存储和清理机制

本文为您介绍 Apache RocketMQ 中消息的存储机制,包括消息的存储粒度、判断依据及后续处理策略等。 背景信息​ 参考 Apache RocketMQ 中队列的定义,消息按照达到服务器的先后顺序被存储到队列中,理论上每个队列都支持无限存储。 但是在实…

87、Redis 的 value 所支持的数据类型(String、List、Set、Zset、Hash)---->List相关命令

本次讲解要点: List相关命令:是指value中的数据类型 启动redis服务器: 打开小黑窗: C:\Users\JH>e: E:>cd E:\install\Redis6.0\Redis-x64-6.0.14\bin E:\install\Redis6.0\Redis-x64-6.0.14\bin>redis-server.exe redi…

电压信号拉线位移编码器有何突出的特点

电压信号拉线位移编码器有何突出的特点 电压信号拉线位移编码器原理简单,外观工艺做工精细,由铝合金精心打造、坚固耐磨;适合空间较小的环境安装。该产品重复精度达到0.01%;工作电压上可选择5V或5-24V供电,保护功能上具…

博客摘录「 MPLS/LDP原理介绍+报文分析+配置示例」2023年9月26日

//首先发送UDP Hello组播包进行发现;随后TCP三次握手开始建立Session,Active端和Passive端互相初始化和Keepalive保活确认;完成之后可开始进行标签交互。 //首先发送UDP Hello组播包进行发现;随后TCP三次握手开始建立Session&…

2023-9-26 JZ23 链表中环的入口结点

题目链接:链表中环的入口结点 import java.util.*; /*public class ListNode {int val;ListNode next null;ListNode(int val) {this.val val;} } */ public class Solution {public ListNode EntryNodeOfLoop(ListNode head) {if(head null || head.next null …

MTK6765/MT6765联发科4G安卓核心板安兔兔跑分

Mediatek Helio P35 MTK6765是智能手机的主流ARM SoC。它在两个集群中集成了8个ARM Cortex-A53内核(big.LITTLE)。四个性能内核的频率高达2.3 GHz。 集成显卡为PowerVR GE8320,频率高达680 MHz。 集成内存控制器支持1500 MHz或933 MHz LPDDR3的LPDDR4x。 MT6765处理…

澜渟:长期主义才能成就专研企业

企业的增长模式有三种:第一种是全局增长,即“水大鱼大”式的、更多依靠外界环境的增长;第二种是结构性增长,即找准赛道,随着产业、行业的增长而增长;第三种是内生性增长,即通过内部创新实现增长…

tp6 + swagger 配置文档接口

ThinkPHP 6.0 运行环境要求PHP7.2,兼容PHP8.1 安装 composer create-project topthink/think tp 6.0.*如果需要更新框架使用 composer update topthink/framework文档 完全开发手册 swagger 文档 注解文档 安装包 composer require zircote/swagger-php 引用…

迅为龙芯3A5000_7A2000运行国产Loongnix、银河麒麟、统信UOS以及实时系统翼辉SylixoS系统

iTOP-3A5000开发板采用全国产龙芯3A500处理器,基于龙芯自主指令系统 (LoongArch)的LA464微结构,并进一步提升频率,降低功耗,优化性能。在与龙芯3A4000处理器保持引脚兼容的基础上,频率提升至2.5GHZ,功耗降低…

Vue+Three.js实现三维管道可视化及流动模拟续集

继上一篇文章中实现了三维管道的可视化和流动模拟,经过反馈,对大家还是有一定帮助,因此就编写了一个续集,相当于增加了一些常见的通用共性功能,主要在前面的基础上增加了以下功能:1.新增直角拐弯的管道,工业中很多管道都是横平竖直的,相当于我们装修的水管或电线等,不…

龙芯2K1000核心板在智能座舱行业产品方案-迅为电子

迅为2K1000核心板是一款高性能的处理器,适用于智能座舱行业。它具备多核CPU、高级图像处理和丰富的接口选项,可用于开发先进的智能座舱解决方案,提高乘坐体验、安全性和便捷性。以下是2K1000处理器在智能座舱行业中的产品方案。 高清晰度显…

跨网传输文件时,如何通过日志记录来审计追溯?

跨网文件传输也就是内外网文件传输,一直是企业最基本的传输需求,无论是内部的业务数据、技术文档、合同报告,还是外部的客户资料、合作方案、市场分析,都需要通过不同的网络进行安全高效的传输。然而,跨网传输文件也存…

curl 接口调用工具

后端接口开发完成,你还在为等待前端而无法调试吗? 今天分享一个小工具,curl,一个命令行文件传输工具。可用于大家平常开发的接口调用测试。 它支持文件的上传和下载,支持包括HTTP、HTTPS、ftp等众多协议,…

vue3+eleement plus日历选择季度

<template><div class"el-quarter-wrap"><el-popover width"280" v-model"visible"><template #reference><el-input v-model"quarterDate" placeholder"请选择季度" clearable :prefix-icon&qu…

【Vue.js】使用ElementUI搭建动态树数据表格与分页

一&#xff0c;动态树 本文章为上一篇文章拓展内容》》实现首页导航及左侧菜单 将左侧菜单结构更换为下面代码&#xff1a; 菜单结构&#xff1a; <el-menu><el-submenu index"" key""><template slot"title"><i class…