处理跨域问题

news2025/2/25 10:18:01

这里只讨论后端对跨域支持,前端的跨域支持一般都是在测试阶段用用的,跨域还是要后端解决

跨域问题的产生:浏览器的一种安全机制-->同源策略限制

同源策略:URL中包括协议,域名,IP,端口都要完全相同,如果有一项不同,浏览器会觉得有安全风险,不让访问.

前后端分离开发后,这种跨域请求变得突出

W3C 在2014年发布的 RFC 6454 中引入了预检请求的概念,用于在实际请求之前进行预先检查。

浏览器为了支持跨域请求,解决浏览器同源策略出现的问题引入了一种机制---->预检请求

预检请求主要用于确保服务器允许实际请求的发起。服务器在接收到预检请求后,会根据预检请求的信息进行检查,判断是否允许实际请求。如果允许,服务器会在响应头中包含一些 CORS 相关的信息,告诉浏览器可以发送实际请求。这个过程有助于防止恶意网站对其他网站的资源进行滥用。

预见请求就是浏览器自动发出一个查询请求,用来确认目标资源是否支持跨域。

预检请求一定是OPTIONS请求

OPTIONS 请求:

  • 用途: 用于在实际请求之前,向服务器发起一个预检请求,以检查服务器是否支持跨域请求。
  • 特点: OPTIONS 请求通常包含一些头信息,如 OriginAccess-Control-Request-MethodAccess-Control-Request-Headers 等,以询问服务器是否允许实际请求。服务器在收到 OPTIONS 请求后,会检查这些头信息,并决定是否允许实际请求。
  • 例子: CORS(Cross-Origin Resource Sharing)中的预检请求就是 OPTIONS 请求。

那么什么样的请求,会发送预检请求?

浏览器将请求分类为简单请求和非简单请求

对于简单请求和非简单请求的概念

简单请求:

GET,HEAD,POST请求,但是Content-Type必须是'application/x-www.form-urlencoded'或者'multipart/form-data'或者'text/plain'三者其中之一,没有自定义请求头并且只能有以下一个或者多个请求头包括:Accept,Accept-Language,Content-Language,Content-Type(必须是'application/x-www.form-urlencoded'或者'multipart/form-data'或者'text/plain'三者其中之一),Cache-Control,Expires,Last-Modified,Pragma.

非简单请求:包括PUT,DELETE请求或者包含自定义请求头的其他请求或者Content-Type不是'application/x-www.form-urlencoded'或者'multipart/form-data'或者'text/plain'三者其中之一的请求

一般现在前后端交互都用application/json因此基本都是复杂请求

非简单请求会发送预见请求询问服务器是否允许跨域

演示下非简单请求发送时的情况:

这里浏览器没看到预检请求的发送  可以由于版本问题

后端解决办法1

老版本的Chrome浏览器

做法在chrome地址栏总输入 chrome://flags/#out-of-blink-cors
将其设置为Disabled后重启浏览器

玩了半天  新版本Chrome浏览器的预检请求在Other里,按住Ctrl键+鼠标左点击上面的Fetch/XHR和Other看到预检请求

注意注意,浏览器有缓存,清理缓存,还有后端如果设置了预检请求有效期,那么只有第一次请求才有,后面存活时间内不会发送预检你可能查1天都查不出来,还有注意是否有开启代理,把代理关了(可能影响,只是可能,反正我没影响)

  1. ccess-Control-Allow-Origin: 这个头表示允许访问资源的域。如果服务器明确知道请求是来自特定的域,可以设置这个头为对应的域。如果是公开的资源,可以设置为 *,表示允许所有域的访问。

  2. Access-Control-Allow-Methods: 这个头表示允许实际请求使用的 HTTP 方法。如果服务器只允许特定的方法,例如 GET、POST,那么就在这个头中设置相应的方法。

  3. Access-Control-Allow-Headers: 这个头表示允许实际请求携带的请求头字段。如果请求中包含的请求头字段在这个头中,浏览器将允许实际请求。通常,如果请求中包含了自定义的请求头,服务器需要设置这个头来允许这些请求头字段。

  4. Access-Control-Allow-Credentials: 这个头表示是否允许携带身份凭证(例如 cookies、HTTP 认证信息)进行跨域请求。如果服务器需要接受携带身份凭证的请求,可以设置这个头为 true。注意,如果设置为 true,前端发起请求时需要将 withCredentials 属性设置为 true。

  5. Access-Control-Max-Age: 这个头表示预检请求的结果可以被缓存的时间,以减少对服务器的频繁请求。这个头是可选的,不一定要包含。

以上并不是一定要配置,看具体项目需要

通常解决跨域问题不会在每个控制器 控制器上去加@CrossOrign的方式

原因,项目都有过滤器或拦截器,请求还没到控制器就玩个der

行进跨域访问配置有三种方式

1.过滤器    2.拦截器   3.实现WebMvcConfigurer并重写addCorsMappings方法

主要是执行时机

这里用实现WebMvcConfigurer重写addCorsMappings的方法

/**
 * @author hrui
 * @date 2023/11/29 4:19
 */
@Configuration
public class WebConfig implements WebMvcConfigurer {

    //处理跨域
    @Override
    public void addCorsMappings(CorsRegistry registry) {
        System.out.println("===========addCorsMappings===========");
        registry.addMapping("/**")//选择可以跨域请求的路径
                //.addMapping("/api/**")
                .allowedOriginPatterns("*")//表示允许来自任意域的请求
                .allowedMethods("GET", "HEAD", "POST", "PUT", "DELETE", "OPTIONS")//允许的实际请求方式,这个不影响预检请求axios.defaults.withCredentials = true;才可以携带Cookie
                .allowCredentials(true)//是否允许携带凭证信息(Cookie)sessionId 这里测试即使后端允许,前端
                .maxAge(3600)//该预检请求的有效时间 单位是秒  有效期内不需要再次发送预检请求
                //.allowedHeaders("*");//表示允许所有请求头
                .allowedHeaders("token");//这样设置,前端只能携带名为token的自定义请求头,也可以不自定请求头发送预检请求,但是不能定义其他名称的请求头
    }
}

如果上面这样设置 那么前端请求拦截器

拦截器过滤器参考

@CrossOrigin注解解决跨域和过滤器拦截器存在的问题-CSDN博客

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

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

相关文章

【Vulnhub靶机】lampiao--DirtyCow

文章目录 漏洞介绍简介原因类型版本危害 信息收集主机扫描端口扫描 漏洞探测漏洞利用权限提升nc文件传输编译 参考 靶机地址:lampiao 下载地址:Lampio: 1 漏洞介绍 简介 脏牛(Dirty Cow)是Linux内核的一个提权漏洞,…

【Python】SqlmapAPI调用实现自动化SQL注入安全检测

文章目录 简单使用优化 应用案例:前期通过信息收集拿到大量的URL地址,这个时候可以配置sqlmapAP接口进行批量的SQL注入检测 (SRC挖掘) 查看sqlmapapi使用方法 python sqlmapapi.py -h启动sqlmapapi 的web服务: 任务流…

Linux常用命令——rm 命令

文章目录 Linux系统中的rm命令是一个非常强大且危险的工具,用于删除文件和目录。由于其具有不可逆的特性,了解其参数和正确使用非常重要。 1. 基本用法 rm命令的基本格式是rm [选项] 文件或目录。不带任何选项时,rm命令仅删除文件。 示例&a…

计算机图形学:直线的扫描转换算法解析与实现

直线的扫描转换: DDA算法: 推理: 在计算机显示图形时,由于显示计算机的分辨率是有限的所以我们在绘制图形时需要将图形从连续量转换成离散量才能完成图形的绘制,直线的扫描转换就是将连续量转换为离散量的过程。 对…

【计算机网络】虚拟路由冗余(VRRP)协议原理与配置

目录 1、VRRP虚拟路由器冗余协议 1.1、协议作用 1.2、名词解释 1.3、简介 1.4、工作原理 1.5、应用实例 2、 VRRP配置 2.1、配置命令 1、VRRP虚拟路由器冗余协议 1.1、协议作用 虚拟路由冗余协议(Virtual Router Redundancy Protocol,简称VRRP)是由IETF…

iMazing是什么软件?2024最新版本如何下载

iMazing是一款功能强大的iOS设备管理软件,它可以帮助用户备份和管理他们的iPhone、iPad或iPod Touch上的数据。除此之外,它还可以将备份数据转移到新的设备中、管理应用程序、导入和导出媒体文件等。本文将详细介绍iMazing的功能和安全性,并教…

【上海大学数字逻辑实验报告】二、组合电路(一)

一、 实验目的 熟悉TTL异或门构成逻辑电路的基本方式;熟悉组合电路的分析方法,测试组合逻辑电路的功能;掌握构造半加器和全加器的逻辑测试;学习使用可编程逻辑器件的开发工具 Quartus II设计电路。 二、 实验原理 异或门是数字…

Python-pip配置国内镜像源,快速下载包

文章目录 国内镜像源临时使用永久配置添加环境变量Path测试关于Python技术储备一、Python所有方向的学习路线二、Python基础学习视频三、精品Python学习书籍四、Python工具包项目源码合集①Python工具包②Python实战案例③Python小游戏源码五、面试资料六、Python兼职渠道 国内…

Java数据结构之《栈实现括号匹配的检验》问题

一、前言: 这是怀化学院的:Java数据结构中的一道难度中等的一道编程题(此方法为博主自己研究,问题基本解决,若有bug欢迎下方评论提出意见,我会第一时间改进代码,谢谢!) 后面其他编程题只要我写完…

黑马头条登陆功能详述

基于session的短信登陆: 发送验证码、短信验证码登陆、注册在后端,校验登陆在springmvc的连接器中,根据请求携带cookie来确定找到session 短信验证登陆与注册新用户: /*** 发送验证码*/Overridepublic Result sendCode(String ph…

Spark on yarn 模式的安装与部署

任务描述 本关任务: Spark on YARN 模式的安装与部署。 相关知识 为了完成本关任务,你需要掌握: Spark 部署模式的种类;Spark on YARN 模式的安装。 Spark 部署模式 Spark 部署模式主要分为以下几种,Spark Stand…

基于LangChain实现的知识库问答工具Langchain-Chatchat

基于embeddingLangChainChatGLM2-6B 构建行业知识库 Langchain-Chatchat LangChain 中文文档 langchain 本文使用的Langchain-Chatchat版本是0.2.7 一、构建垂类行业知识库的两种方案 方案一:使用开源LLM本地部署和微调 优点:数据最安全&#xff0c…

Java第二十章总结

一、线程简介 1.什么是进程: 进程是程序的运行过程,是系统进行资源分配和调度的一个独立单位。通俗来讲,进程就是在操作系统中运行的程序,例如:电脑中运行的微信、eclipse、idea等。 2.什么是线程 线程是操作系统能…

目标检测——R-CNN算法解读

论文:Rich feature hierarchies for accurate object detection and semantic segmentation 作者:Ross Girshick, Jeff Donahue, Trevor Darrell, Jitendra Malik 链接:https://arxiv.org/abs/1311.2524 代码:http://www.cs.berke…

不会PS!超简单的制作产品册方法

​产品册是展示产品的重要工具,对于很多企业来说,制作一本精美的产品册是必不可少的。但是,对于一些不会PS的人来说,制作产品册可能会觉得非常困难。其实,制作产品册并不需要PS等专业工具,只需要一些简单的…

电巢直播|揭秘FCBGA先进封装基板兴力量ze

随着2022年底ChatGPT的问世,我们不仅见证了从互联网时代到AI应用时代的跨越,也迎来了一个数据流量不断攀升的新纪元。在这个以数据为核心的新时代,算力网络成为支撑巨大数字经济的基石,其背后则是对硬件性能持续提升的迫切需求。 …

重点在正负上如何描述?看CHAT有何见解

问CHAT:重点在正负上如何描述? CHAT回复:在描述数据的波动情况时,也可关注其正负方向的变化。通常有以下几种方式: 1. 均值(Mean):在一众数值中,如果大部分数值是正值且…

【数值计算方法(黄明游)】常微分方程初值问题的数值积分法:欧拉方法(向后Euler)【理论到程序】

文章目录 一、数值积分法1. 一般步骤2. 数值方法 二、欧拉方法(Euler Method)1. 向前欧拉法(前向欧拉法)2. 向后欧拉法(后向欧拉法)a. 基本理论b. 算法实现 常微分方程初值问题的数值积分法是一种通过数值方…

ISCTF2023 部分wp

学一年了还在入门( web where_is_the_flag ISCTF{41631519-1c64-40f6-8dbb-27877a184e74} 圣杯战争 <?php // highlight_file(__FILE__); // error_reporting(0);class artifact{public $excalibuer;public $arrow;public function __toString(){echo "为Saber选择…

实施工程师运维工程师面试题

Linux 1.请使用命令行拉取SFTP服务器/data/20221108/123.csv 文件&#xff0c;到本机一/data/20221108目录中。 使用命令行拉取SFTP服务器文件到本机指定目录&#xff0c;可以使用sftp命令。假设SFTP服务器的IP地址为192.168.1.100&#xff0c;用户名为username&#xff0c;密…