当前位置: 首页 > article >正文

跨域_Cross-origin resource sharing

同源是指"协议+域名+端口"三者相同,即便两个不同的域名指向同一个ip,也非同源

1.什么是CORS?

CORS是一个W3C标准,全称是"跨域资源共享"(Cross-origin resource sharing)。它允许浏览器向跨源服务器,发出XMLHttpRequest请求,从而克服了AJAX只能同源使用的限制。

2.简单请求和复杂请求的区别

2.1.简单请求

(1)请求方法是以下三种方法之一:
    HEAD、 GET、POST
(2)HTTP的头信息不超出以下几种字段:
    Accept
    Accept-Language
    Content-Language
    Last-Event-ID
    Content-Type:只限于三个值application/x-www-form-urlencoded、multipart/form-data、text/plain

当浏览器发现发起的ajax请求是简单请求时,会在请求头中携带一个字段:Origin.
Origin中会指出当前请求属于哪个域(协议+域名+端口)和Request URL进行对比。服务会根据这个值决定是否允许其跨域。

如果服务器允许跨域,需要在返回的响应头中携带下面信息:
    Access-Control-Allow-Origin: http://manage.leyou.com
    Access-Control-Allow-Credentials: true
    Content-Type: text/html; charset=utf-8
Access-Control-Allow-Origin:可接受的域,是一个具体域名或者*(代表任意域名)
Access-Control-Allow-Credentials:是否允许携带cookie,默认情况下,cors不会携带cookie,除非这个值是true。

要想操作cookie,需要满足3个条件:

  •     服务的响应头中需要携带Access-Control-Allow-Credentials并且为true
  •     浏览器发起ajax需要指定withCredentials 为true
  •     响应头中的Access-Control-Allow-Origin一定不能为*,必须是指定的域名

2.2.复杂请求

预检请求(preflight):特殊请求会在正式通信之前,增加一次HTTP查询请求,称为"预检"请求。

浏览器先询问服务器,当前网页所在的域名是否在服务器的许可名单之中,以及可以使用哪些HTTP动词和头信息字段。只有得到肯定答复,浏览器才会发出正式的XMLHttpRequest请求,否则就报错。

与简单请求相比,除了Origin以外,多了两个请求头:

Access-Control-Request-Method:接下来会用到的请求方式,比如PUT

Access-Control-Request-Headers:会额外用到的头信息

如果服务允许跨域,除了Access-Control-Allow-Origin和Access-Control-Allow-Credentials以外,这里又额外多出3个头:

Access-Control-Allow-Methods:允许访问的方式;

Access-Control-Allow-Headers:允许携带的头;

Access-Control-Max-Age:本次许可的有效时长,单位是秒,过期之前的ajax请求就无需再次进行预检了。

3.解决跨域

3.1 重新注入CorsFilter解决跨域

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;/*** 跨域:指浏览器不允许当前页面所在的源去请求另一个源的数据。(要理解当前页面源是什么?)* 同源策略(SOP Same origin policy):是一种约定,由Netscape公司1995年引入浏览器,* 它是浏览器最核心也是最基本的安全功能,如果缺少同源策略,浏览器很容易受到XSS、CSFR* 等攻击。所谓同源是指"协议+域名+端口"三者相同,即便两个不同的域名指向同一个ip,也非同源。*/
@Configuration
public class LeyouCorsConfiguration {@Beanpublic CorsFilter corsFilter() {// 初始化cros配置对象CorsConfiguration corsConfiguration = new CorsConfiguration();// 允许跨域的域名,如果要携带cookie,不能写*。*:代表所有的域名都可以跨域访问// 可以添加多个域名(源:你页面所在的源)corsConfiguration.addAllowedOrigin("http://manage.leyou.com");// 允许携带cookiecorsConfiguration.setAllowCredentials(true);// 允许跨域的请求方法,*代表所有方法。可以添加多个corsConfiguration.addAllowedMethod("*");// 允许跨域携带的头信息,*代表所有头。可以添加多个corsConfiguration.addAllowedHeader("*");// 本次许可的有效时间,单位秒,过期之前的ajax请求就无需再次进行预检啦// 默认是1800s,此处设置1hcorsConfiguration.setMaxAge(3600L);// 初始化cors配置源对象UrlBasedCorsConfigurationSource urlBasedCorsConfigurationSource = new UrlBasedCorsConfigurationSource();// 拦截一切路径urlBasedCorsConfigurationSource.registerCorsConfiguration("/**", corsConfiguration);// 返回新的CorsFilterreturn new CorsFilter(urlBasedCorsConfigurationSource);}
}

3.2 实现 WebMvcConfigurer的addCorsMappings 的方法

注意注意注意:addMapping()配置应用路径(server.servlet.context-path)是不能进行拦截的,拦截的而是Controller配置确切的路径。一般配置/**即可,即拦截所有Controller配置的路径 

import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.CorsRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;@Configuration
public class CorsConfig implements WebMvcConfigurer {@Overridepublic void addCorsMappings(CorsRegistry registry) {// 拦截的路径// 注意注意注意:addMapping()配置应用路径(server.servlet.context-path)是不能进行拦            // 截的,拦截的而是Controller配置确切的路径// 一般配置/**即可,即拦截所有Controller配置的路径registry.addMapping("/**")// 允许跨域的域名,*:代表所有。允许携带cookie不能为*.allowedOrigins("*")// 允许跨域的请求方法.allowedMethods("GET", "HEAD", "POST", "PUT", "DELETE", "OPTIONS")// 是否允许跨域携带cookie,为true允许跨域的域名需要指定,不能为*.allowCredentials(false)// 本次许可的有效时间,单位秒,过期之前的ajax请求就无需再次进行预检// 默认是1800s,此处设置1h.maxAge(3600)// 允许跨域携带的头信息,*代表所有头。可以添加多个.allowedHeaders("*");}
}

  3.3 创建一个 filter 解决跨域

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;@Component
@WebFilter(urlPatterns = { "/*" }, filterName = "headerFilter")
public class HeaderFilter implements Filter {private static final Logger logger = LoggerFactory.getLogger(HeaderFilter.class);@Overridepublic void doFilter(ServletRequest servletRequest, ServletResponse servletResponse,FilterChain filterChain) throws IOException, ServletException {HttpServletResponse httpServletResponse = (HttpServletResponse)servletResponse;// 解决跨域访问报错// 允许跨域的域名,*:代表所有域名httpServletResponse.setHeader("Access-Control-Allow-Origin", "*");// 允许跨域请求的方法httpServletResponse.setHeader("Access-Control-Allow-Methods",  "POST, PUT, GET, OPTIONS, DELETE");// 本次许可的有效时间,单位秒,过期之前的ajax请求就无需再次进行预检啦// 默认是1800s,此处设置1hhttpServletResponse.setHeader("Access-Control-Max-Age", "3600");// 允许的响应头httpServletResponse.setHeader("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept, client_id, uuid, Authorization");// 支持HTTP 1.1.httpServletResponse.setHeader("Cache-Control", "no-cache, no-store, must-revalidate");// 支持HTTP 1.0. response.setHeader("Expires", "0");httpServletResponse.setHeader("Pragma", "no-cache");// 编码httpServletResponse.setCharacterEncoding("UTF-8");// 放行filterChain.doFilter(servletRequest, servletResponse);}@Overridepublic void init(FilterConfig filterConfig) throws ServletException {logger.info("-----------------cross origin filter start-------------------");}@Overridepublic void destroy() {logger.info("-----------------cross origin filter end-------------------");}
}

3.4 @CrossOrigin注解

@CorssOrigin一个注解轻松解决,可以用在类上和方法。
                        
参考文章:原文链接:https://blog.csdn.net/m0_48983233/article/details/122017773

相关文章:

跨域_Cross-origin resource sharing

同源是指"协议域名端口"三者相同,即便两个不同的域名指向同一个ip,也非同源 1.什么是CORS? CORS是一个W3C标准,全称是"跨域资源共享"(Cross-origin resource sharing)。它允许浏览器向跨源服务器&#xff…...

Opencv常见学习链接(待分类补充)

文章目录 1.常见学习链接 1.常见学习链接 1.Opencv中文官方文档 2.Opencv C图像处理:矩阵Mat 随机数RNG 计算耗时 鼠标事件 3.Opencv C图像处理:亮度对比度饱和度高光暖色调阴影漫画效果白平衡浮雕羽化锐化颗粒感 4.OpenCV —— 频率域滤波&#xff…...

大疆制图跑飞马D2000的正射与三维模型

1 问题描述 大疆制图在跑大疆无人机飞的影像的时候,能够自动识别相机参数并且影像自带pos信息,但是用飞马无人机获取的影像pos信息与影像是分开的(飞马无人机数据处理有讲),所以在用大疆制图时需要对相机参数进行设置…...

PostgreSQL中的权限管理简介

在 PostgreSQL 中,权限管理是非常重要的,它允许管理员控制用户对数据库对象的访问权限。其中,权限管理是通过角色和权限来实现的。角色可以是用户、组或者其他角色,而权限则控制了角色对数据库对象的访问权限。 1.用户和角色 在…...

ConceptAttention:Diffusion Transformers learn highly interpretable features

ConceptAttention: Diffusion Transformers Learn Highly Interpretable Featureshttps://arxiv.org/html/2502.04320?_immersive_translate_auto_translate=1用flux的attention来做图文的显著性分析。 1.i...

物联网低功耗保活协同优化方案:软硬件与WiFi网关动态联动

目录 一、总体方案概述 二、架构组成 2.1 系统拓扑 2.2 硬件端(MCU + WiFi 模组) 2.3 WiFi 网关 2.4 云端服务器 三、低功耗保活技术设计模式 3.1 模式一:定时唤醒 + MQTT 保活 3.1.1 设备端 3.1.2 优势 3.2 模式二:网关保活代理 + 本地网络唤醒 3.2.1 网关功能…...

LW-CTrans:一种用于三维医学图像分割的轻量级CNN与Transformer混合网络|文献速递-深度学习医疗AI最新文献

Title 题目 LW-CTrans: A lightweight hybrid network of CNN and Transformer for 3Dmedical image segmentation LW-CTrans:一种用于三维医学图像分割的轻量级CNN与Transformer混合网络 01 文献速递介绍 三维医学图像分割旨在从计算机断层扫描(CT…...

光谱相机在地质勘测中的应用

一、‌矿物识别与蚀变带分析‌ ‌光谱特征捕捉‌ 通过可见光至近红外(400-1000nm)的高光谱分辨率(可达3.5nm),精确识别矿物的“光谱指纹”。例如: ‌铜矿‌:在400-500nm波段反射率显著低于围…...

Autodl训练Faster-RCNN网络(自己的数据集)

参考文章: Autodl服务器中Faster-rcnn(jwyang)复现(一)_autodl faster rcnn-CSDN博客 Autodl服务器中Faster-rcnn(jwyang)训练自己数据集(二)_faster rcnn autodl-CSDN博客 环境配置 我到下载torch这一步老是即将结束的时候自动结束进程,所以还是自己…...

每日两道leetcode(今天开始刷基础题模块——这次是之前的修改版)

1768. 交替合并字符串 - 力扣(LeetCode) 题目 给你两个字符串 word1 和 word2 。请你从 word1 开始,通过交替添加字母来合并字符串。如果一个字符串比另一个字符串长,就将多出来的字母追加到合并后字符串的末尾。 返回 合并后的…...

服务器数据迁移终极指南:网站、数据库、邮件无缝迁移策略与工具实战 (2025)

嘿,各位服务器的“大管家”们!咱们在IT江湖闯荡,总有那么些时候,不得不面对一个既重要又可能让人头皮发麻的任务——服务器迁移!可能是因为旧服务器“年事已高”想给它换个“新家”,也可能是业务发展太快&a…...

NFS服务小实验

实验1 建立NFS服务器,使的客户端顺序共享数据 第一步:服务端及客户端的准备工作 # 恢复快照 [rootserver ~]# setenforce 0 ​ [rootserver ~]# systemctl stop firewalld ​ [rootserver ~]# yum install nfs-utils -y # 服务端及客户端都安装 …...

vue 中的v-once

&#x1f530; 基础理解 ✅ 语法&#xff1a; <span v-once>{{ msg }}</span>✅ 效果&#xff1a; • 只渲染一次&#xff0c;之后无论数据如何变化&#xff0c;该内容都不会更新。 • 非常适用于静态内容或首次加载后不需要变化的数据。&#x1f9ea; 示例&…...

鸿蒙ArkTS-发请求第三方接口显示实时新闻列表页面

发请求展示新闻列表 鸿蒙ArkTS-发请求第三方接口显示实时新闻列表页面 1. 效果图 新闻首页&#xff1a; 点击某一新闻的详情页面&#xff08;需要使用模拟器才能查看详情页面&#xff09;&#xff1a; 2. 代码 1. key准备 首先需求到聚合网申请一个key&#xff0c;网址如下…...

2025年开源大模型技术全景图

迈向2025年&#xff0c;开源大型语言模型&#xff08;LLM&#xff09;生态系统已不再仅仅是闭源模型的补充&#xff0c;而是成为推动AI创新与民主化的核心引擎。其技术全景展现了一个高度模块化、协作共生且快速演进的复杂网络。以下是对提供的蓝图进行更细致的解读&#xff0c…...

【创造型模式】工厂方法模式

文章目录 工厂方法模式工厂方法模式当中的角色和职责工厂方法模式的实现工厂方法模式的优缺点 工厂方法模式 今天我们继续学习一例创造型设计模式——工厂方法模式。参考的主要资料是刘丹冰老师的《Easy 搞定 Golang 设计模式》。 工厂方法模式当中的角色和职责 简单来说&…...

【MySQL】使用文件进行交互

目录 准备工作 1.从文本文件中读取数据&#xff08;导入&#xff09; 1.1.CSV 文件 1.2.设置导入导出的路径 1.3.导入文件 1.4.将数据写入文本文件&#xff08;导出&#xff09; 2.从文件中读取并执行SQL命令 2.1.通过mysql监视器执行编写在文件里面的SQL语句 2.2.通过…...

# 大模型的本地部署与应用:从入门到实战

大模型的本地部署与应用&#xff1a;从入门到实战 在当今人工智能飞速发展的时代&#xff0c;大模型&#xff08;尤其是大型语言模型&#xff0c;LLMs&#xff09;已经成为自然语言处理&#xff08;NLP&#xff09;领域的核心力量。从文本生成、机器翻译到问答系统&#xff0c…...

布丁扫描高级会员版 v3.5.2.2| 安卓智能扫描 APP OCR文字识别小助手

布丁扫描高级会员版 v3.5.2.2| 安卓智能扫描 APP OCR文字识别小助手 布丁扫描APP是一款集成了先进图像处理与OCR文字识别技术的智能扫描软件。它旨在将纸质文档、照片、名片、书籍等各类实体资料快速…...

可视化大屏全屏后重载echarts图表

问题&#xff1a;可视化大屏点击全屏之后&#xff0c;但echarts图表还是之前的大小&#xff0c;并没有撑满该容器&#xff0c;所以这时候我们需要全屏之后重新加载echarts图表内容 代码如下&#xff1a; // 全屏或非全屏状态下重新加载图表window.onresize () > {//lineCh…...

20200201工作笔记常用命令要整理

工作笔记常用命令&#xff1a; 1.repo常用命令&#xff1a; repo sync -c -j10 2. 常用adb命令 错误: error: device unauthorized. This adbds $ADB_VENDOR_KEYS is not set; try adb kill-server if that seems wrong. Otherwise check for a confirmation dialog on your d…...

Java对象内存模型、如何判定对象已死亡?

一、Java对象内存模型 Java对象在内存中由三部分组成&#xff1a; 含类元数据指针&#xff08;指向方法区的Class对象&#xff09;和Mark Word&#xff08;存储对象哈希码、锁状态、GC分代年龄等信息&#xff09;。 若为数组对象&#xff0c;还包含数组长度数据。 1&#xff0c…...

spark任务的提交流程

目录 spark任务的提交流程1. 资源申请与初始化2. 任务划分与调度3. 任务执行4. 资源释放与结果处理附:关键组件协作示意图扩展说明SparkContext介绍 spark任务的提交流程 用户创建一个 Spark Context;Spark Context 去找 Cluster Manager 申请资源同时说明需要多少 CPU 和内…...

ELK简介和docker版安装

使用场景 主要还是给开发人员“打捞日志”用的。 ELK 是由三个开源工具组成的套件&#xff08;Elasticsearch、Logstash 和 Kibana&#xff09;&#xff0c;主要用于日志的收集、分析和可视化。以下是 ELK 常见的使用场景&#xff1a; 日志集中化管理 收集来自多个服务器或服…...

利用条件编译实现RTT可控的调试输出

在嵌入式开发中&#xff0c;调试信息的输出通常对定位问题至关重要。然而&#xff0c;为了保证代码在正式发布时的性能和体积&#xff0c;调试信息往往需要在不修改主逻辑代码的前提下禁用。 代码一览 // debug.h #pragma once// #define DEBUG#ifdef DEBUG#include "SEG…...

【软件设计师】计算机网络考点整理

以下是软件设计师考试中 ​​计算机网络​​ 的核心考点总结&#xff0c;帮助您高效备考&#xff1a; ​​一、网络体系结构与协议​​ ​​OSI七层模型 & TCP/IP四层模型​​ 各层功能&#xff08;物理层-数据链路层-网络层-传输层-会话层-表示层-应用层&#xff09;对应协…...

智慧化工园区安全风险管控平台建设方案(Word)

1 项目概况 1.1 园区概况 1.1.1 XX化工园区简况 1.1.2 企业现状 1.1.3 园区发展方向 1.1.4 园区信息化现状 1.2 项目建设背景 1.2.1 政策背景 1.3 项目建设需求分析 1.3.1 政策需求分析 1.3.2 安全生产监管需求分析 1.3.3 应急协同管理需求分析 1.3.4 工业互联网安…...

【uniapp】 iosApp开发xcode原生配置项(iOS平台Capabilities配置)

如果你需要配置诸如&#xff1a;Access Wi-Fi Information 简单地说就是这个地址 ios平台capabilities配置 本来这种配置就是在Xcode的平台中选中即可&#xff0c;他们的信息会存储在XCode工程的.entitlements和Info.plist文件。 按照uniapp文档说的&#xff0c; HBuilderX4.…...

MYSQL优化(1)

MYSQL调优强调的是如何提高MYSQL的整体性能&#xff0c;是一套整体方案。根据木桶原理&#xff0c;MYSQL的最终性能取决于系统中性能表现最差的组件。可以这样理解&#xff0c;即使MYSL拥有充足的内存资源&#xff0c;CPU资源&#xff0c;如果外存IO性能低下&#xff0c;那么系…...

C++可变参数宏定义语法笔记

1. 基础语法 定义格式&#xff1a; #define MACRO_NAME(fixed_args, ...) macro_body#define LOG(fmt, ...) printf(fmt, __VA_ARGS__) LOG("Value: %d, Name: %s", 42, "Alice"); // 展开为 printf("Value: %d, Name: %s", 42, "Alice&q…...