跨域问题及解决方案

news/2024/11/24 18:47:26/

跨域问题是指在前端Web开发中,不同源的网页之间无法相互访问或通信的问题。产生跨域问题的原因是由于浏览器的同源策略(Same Origin Policy)所导致的。

同源策略是浏览器的一种安全机制,限制了来自不同源(域名、端口、协议)的文档或脚本之间的交互,如 XMLHttpRequest 或 Fetch 请求、跨窗口和跨框架访问文档或脚本等。同源策略的目的是保护用户的隐私和安全,防止恶意代码窃取用户的信息或篡改网页内容。

举个例子,假设有两个网站 A 和 B,它们的 URL 如下:

A网站:https://www.a.com
B网站:https://www.b.com
由于 A 和 B 的协议(http/https)、主机名(www.a.com 和 www.b.com)和端口号(默认为80)都不相同,因此它们被认为是不同的源。如果在A网站中使用 JavaScript 代码尝试获取B网站的数据,就会受到同源策略的限制,无法成功获取数据。

要解决跨域问题,一般有以下几种方式:

JSONP(JSON with Padding)跨域请求:通过在页面上添加一个 标签,并指定其 src 属性为跨域请求的 URL,服务器返回的数据会被当做 JavaScript 代码执行,从而实现跨域数据的获取。不过 JSONP 只支持 GET 请求,且无法处理 POST 请求等场景。
CORS(Cross-Origin Resource Sharing)跨域请求:通过在服务端设置响应头部的 Access-Control-Allow-* 字段,授权指定源可以访问资源,从而实现跨域数据的获取。CORS 请求支持 GET 和 POST 等任意请求方式。
代理跨域请求:通过在自己的服务器上建立代理服务器,将前端请求发送给代理服务器,再由代理服务器向目标服务器发送请求,并返回目标服务器的响应。通常用于请求第三方 API 数据等场景。
解决方案:
前端与后端都会有解决方案
但前端往往不能根本解决问题!
因此如何你的后端同事让作为前端工程师的你来解决问题,请一定来打他!

后端较为主流的解决方案
就在在config中进行配置

package com.fanchen.config;import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.cors.CorsConfiguration;
import org.springframework.web.cors.UrlBasedCorsConfigurationSource;
import org.springframework.web.filter.CorsFilter;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;/*** 跨域请求配置* 解决跨域问题的配置**/
@Configuration
public class CorsConfig implements WebMvcConfigurer {@Beanpublic CorsFilter corsFilter(){// 1. 添加cors配置信息CorsConfiguration config = new CorsConfiguration();// Response Headers里面的Access-Control-Allow-Origin: http://localhost:8080config.addAllowedOrigin("http://localhost:8081");// 其实不建议使用*,允许所有跨域//config.addAllowedOrigin("*");// 设置是否发送cookie信息,在前端也可以设置axios.defaults.withCredentials = true;表示发送Cookie,// 跨域请求要想带上cookie,必须要请求属性withCredentials=true,这是浏览器的同源策略导致的问题:不允许JS访问跨域的Cookie/*** withCredentials前后端都要设置,后端是setAllowCredentials来设置* 如果后端设置为false而前端设置为true,前端带cookie就会报错* 如果后端为true,前端为false,那么后端拿不到前端的cookie,cookie数组为null* 前后端都设置withCredentials为true,表示允许前端传递cookie到后端。* 前后端都为false,前端不会传递cookie到服务端,后端也不接受cookie*/// Response Headers里面的Access-Control-Allow-Credentials: trueconfig.setAllowCredentials(false);// 设置允许请求的方式,比如get、post、put、delete,*表示全部// Response Headers里面的Access-Control-Allow-Methods属性config.addAllowedMethod("*");// 设置允许的header// Response Headers里面的Access-Control-Allow-Headers属性,这里是Access-Control-Allow-Headers: content-type, headeruserid, headerusertokenconfig.addAllowedHeader("*");// Response Headers里面的Access-Control-Max-Age:3600// 表示下回同一个接口post请求,在3600s之内不会发送options请求,不管post请求成功还是失败,3600s之内不会再发送options请求// 如果不设置这个,那么每次post请求之前必定有options请求// 当前跨域请求最大有效时长。这里默认1天long maxAge = 24 * 60 * 60;config.setMaxAge(maxAge);config.addExposedHeader("Authorization");// 2. 为url添加映射路径UrlBasedCorsConfigurationSource corsSource = new UrlBasedCorsConfigurationSource();// /**表示该config适用于所有路由corsSource.registerCorsConfiguration("/**", config);// 3. 返回重新定义好的corsSourcereturn new CorsFilter(corsSource);}
}

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

相关文章

开启php8的JIT及时编译,超级详细 照抄即可

JIT时php8的重要功能之一,可以极大的提高性能; JIT编译器集成在了Opcache插件中,仅在启动Opcache插件才有效 Opcache将 PHP 脚本编译后的字节码存储到内存中,以避免每次执行脚本时重新解析和编译,从而提高 PHP 应用程…

JavaScript表单事件(下篇)

目录 八、keydown: 当用户按下键盘上的任意键时触发。 九、keyup: 当用户释放键盘上的键时触发。 十、keypress: 当用户按下键盘上的字符键时触发。 十一、focusin: 当表单元素或其子元素获得焦点时触发。 十二、focusout: 当表单元素或其子元素失去焦点时触发。 十三、c…

(转载)基于遗传算法的多目标优化算法(matlab实现)

1 理论基础 1.1 多目标优化及Pareto最优解 多目标优化问题可以描述如下: 其中,f(x)为待优化的目标函数;x为待优化的变量;Ib和ub分别为变量x的下限和上限约束;Aeq*xbeq为变量x的线性等式约束;A*x≤b为变…

小端、大端字节序

小端字节序:将低序字节存储在内存低地址 大端字节序:将高序字节存储在内存低地址 16进制可以直观反映内存存储数据的情况 …

RabbitMQ基础

文章目录 前言一、🍧 MQ 相关的概念1、什么是MQ2、为什么要用MQ流量消峰应用解耦异步处理 二、🧃 RabbitMQ1、RabbitMQ 的概念2、四大核心概念生产者交换机队列消费者 3、RMQ的六大核心模式4、工作原理与各个名词介绍5、安装 RMQ 三、🥤 Hell…

5.开源非对称加密算法RSA实现

5.开源非对称加密算法RSA实现 前期内容导读: 开源加解密RSA/AES/SHA1/PGP/SM2/SM3/SM4介绍开源AES/SM4/3DES对称加密算法介绍及其实现开源AES/SM4/3DES对称加密算法的验证实现开源非对称加密算法RSA/SM2实现及其应用 1. 开源组件 非对称秘钥加密介绍 加密组件引入方…

盘点一个Python列表的基础题目

点击上方“Python爬虫与数据挖掘”,进行关注 回复“书籍”即可获赠Python从入门到进阶共10本电子书 今 日 鸡 汤 随意春芳歇,王孙自可留。 大家好,我是皮皮。 一、前言 前几天在Python最强王者群【eric】问了一个Python列表基础的问题&#x…

Ubuntu安装RabbitMQ server - 在ubuntu+cpolar+rabbitMQ环境下,实现mq服务端远程访问

文章目录 前言1.安装erlang 语言2.安装rabbitMQ3. 内网穿透3.1 安装cpolar内网穿透(支持一键自动安装脚本)3.2 创建HTTP隧道 4. 公网远程连接5.固定公网TCP地址5.1 保留一个固定的公网TCP端口地址5.2 配置固定公网TCP端口地址 转载自cpolar内网穿透的文章:无公网IP&…