深入探讨跨域请求(CORS):原理、解决方案与详细示例代码

news2024/12/23 14:19:20

深入探讨跨域请求(CORS):原理、解决方案与详细示例代码

  • 🌐 深入探讨跨域请求(CORS):原理、解决方案与详细示例代码 🌐
    • 摘要
    • 引言
    • 正文内容
      • 什么是跨域?
        • 为什么会有跨域问题?
      • 示例代码
      • 解决方案
        • 1. 添加@CrossOrigin注解
          • 详细描述:
        • 2. 配置WebMvcConfigurer
          • 详细描述:
        • 3. 配置Filter
          • 详细描述:
      • 🤔 QA环节
      • 小结

在这里插入图片描述

博主 默语带您 Go to New World.
个人主页—— 默语 的博客👦🏻
《java 面试题大全》
《java 专栏》
🍩惟余辈才疏学浅,临摹之作或有不妥之处,还请读者海涵指正。☕🍭
《MYSQL从入门到精通》数据库是开发者必会基础之一~
🪁 吾期望此文有资助于尔,即使粗浅难及深广,亦备添少许微薄之助。苟未尽善尽美,敬请批评指正,以资改进。!💻⌨


🌐 深入探讨跨域请求(CORS):原理、解决方案与详细示例代码 🌐

摘要

大家好!我是默语,一个喜欢探讨技术细节的博主。在这篇博客中,我们将深入探讨跨域请求(CORS),了解其原理,并提供具体的解决方案和详细的示例代码。跨域问题是前后端分离架构中经常遇到的一个难题,通过本篇文章,你将学会如何优雅地解决它!🤓

引言

跨域资源共享(CORS)是一个涉及网络请求的常见问题,特别是在现代的前后端分离开发模式下。许多开发者在处理跨域请求时会遇到各种难题,这篇文章将从基础知识开始,逐步深入,提供实用的解决方案和详细的代码示例,帮助你轻松应对跨域问题。

正文内容

什么是跨域?

跨域是指浏览器因安全限制,阻止一个域的网页向另一个域发起请求的一种行为。浏览器出于安全考虑,会默认阻止跨域请求,但在实际开发中,我们常常需要进行跨域访问。

为什么会有跨域问题?

跨域问题主要源自浏览器的同源策略。同源策略要求协议、域名、端口均相同的请求才允许通过,任何一个不同都会被视为跨域请求。例如,当你在http://example.com的网页中请求http://api.example.com的数据时,就会触发跨域请求。

示例代码

我们可以通过一个简单的例子来展示跨域请求问题:

// 跨域请求示例代码
fetch('http://example.com/api/data')
  .then(response => response.json())
  .then(data => console.log(data))
  .catch(error => console.error('Error:', error));

如果http://example.com与当前页面的域名不同,那么浏览器会阻止这个请求,并在控制台中显示一个跨域错误信息。

解决方案

为了解决跨域问题,我们可以采用多种方案。以下是几种常见的解决方法:

1. 添加@CrossOrigin注解

对于使用Spring Boot的项目,可以在控制器类或方法上添加@CrossOrigin注解,允许特定域名的跨域请求:

@RestController
@CrossOrigin(origins = "http://example.com")
public class MyController {
    
    @GetMapping("/api/data")
    public ResponseEntity<String> getData() {
        return ResponseEntity.ok("Hello, World!");
    }
}
详细描述:
  • @RestController:这是一个组合注解,相当于同时使用@Controller@ResponseBody。它表示该类中的所有方法都会返回JSON或XML格式的数据。
  • @CrossOrigin(origins = "http://example.com"):这个注解允许来自http://example.com的跨域请求。origins属性可以设置为多个域名,甚至可以设置为*以允许所有域名,但这样做不安全。
  • @GetMapping("/api/data"):这是一个快捷注解,用于处理GET请求。/api/data表示请求的URL路径。
  • ResponseEntity<String>:这是一个包含HTTP响应的实体,ok()方法表示返回200 OK的状态。
2. 配置WebMvcConfigurer

另一种方式是通过配置WebMvcConfigurer来全局允许跨域请求。这种方式适用于需要统一配置跨域策略的场景:

@Configuration
public class WebConfig implements WebMvcConfigurer {

    @Override
    public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("/**")
                .allowedOrigins("http://example.com")
                .allowedMethods("GET", POST, "PUT", "DELETE")
                .allowCredentials(true);
    }
}
详细描述:
  • @Configuration:这个注解表示该类是一个配置类,用于定义Bean和配置设置。
  • WebMvcConfigurer:这是一个配置接口,允许自定义Spring MVC的配置。
  • addCorsMappings:这是一个方法,用于配置跨域请求规则。CorsRegistry提供了一个API来添加跨域映射。
    • addMapping("/**"):表示对所有路径生效。
    • allowedOrigins("http://example.com"):允许http://example.com域的请求。
    • allowedMethods("GET", "POST", "PUT", "DELETE"):允许指定的HTTP方法。
    • allowCredentials(true):允许发送Cookie。
3. 配置Filter

我们还可以通过配置过滤器来解决跨域问题,这种方式更灵活,可以满足复杂的跨域需求:

import javax.servlet.*;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@Component
public class CorsFilter implements Filter {

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
            throws IOException, ServletException {
        HttpServletResponse res = (HttpServletResponse) response;
        res.setHeader("Access-Control-Allow-Origin", "http://example.com");
        res.setHeader("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE");
        res.setHeader("Access-Control-Allow-Credentials", "true");
        chain.doFilter(request, response);
    }
}
详细描述:
  • @Component:这个注解表示该类是一个Spring组件,会被Spring容器管理。
  • Filter:这是一个Servlet过滤器接口,用于在请求和响应之间进行过滤处理。
  • doFilter:这是过滤器的核心方法,每次请求都会执行这个方法。
    • ServletRequestServletResponse:表示HTTP请求和响应。
    • FilterChain:用于传递请求和响应到下一个过滤器或目标资源。
    • HttpServletResponse res = (HttpServletResponse) response:将ServletResponse强制转换为HttpServletResponse,以便设置CORS头。
    • setHeader方法:设置CORS相关的HTTP头,允许指定域、方法和是否发送Cookie。

🤔 QA环节

问:是否可以允许所有来源的跨域请求?

答:从安全角度考虑,不建议允许所有来源的跨域请求。最好只允许受信任的来源,以避免潜在的安全风险。例如,虽然设置allowedOrigins("*")可以允许所有来源,但这可能会带来安全隐患。

问:CORS配置是否支持复杂请求?

答:是的,CORS配置可以支持复杂请求,包括但不限于自定义头部、不同的HTTP方法等。通过设置allowedHeadersexposedHeaders,可以进一步自定义跨域请求的行为。

小结

通过本文,我们了解了跨域问题的产生原因,并介绍了几种常见的解决方案。无论是使用注解、配置类还是过滤器,都可以有效地解决跨域问题,具体选择哪种方法可以根据项目的实际情况来决定

在这里插入图片描述


🪁🍁 希望本文能够给您带来一定的帮助🌸文章粗浅,敬请批评指正!🍁🐥

如对本文内容有任何疑问、建议或意见,请联系作者,作者将尽力回复并改进📓;(联系微信:Solitudemind )

点击下方名片,加入IT技术核心学习团队。一起探索科技的未来,共同成长。

在这里插入图片描述

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

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

相关文章

Linux网络诊断工具mtr命令详解

目录 一、mtr概述 二、mtr的特点 1、动态路由显示 2、数据包类型 3、显示延迟和丢包 4、过滤和日志 5、网络探测 三、基本用法 1、基本语法 2、帮助 3、常用选项 四、输出解释 1、常见mtr命令及其输出 2、输出解释 四、命令实例 1. 最基本的用法 2. 显示报告形式…

Golang Context详解

文章目录 基本介绍context源码剖析Context接口emptyCtxcancelCtxtimerCtxvalueCtx context使用案例协程取消超时控制数据共享 基本介绍 基本介绍 在Go 1.7版本中引入了上下文&#xff08;context&#xff09;包&#xff0c;用于在并发编程中管理请求范围的数据、控制生命周期、…

力扣----轮转数组

题目链接&#xff1a;189. 轮转数组 - 力扣&#xff08;LeetCode&#xff09; 思路一 我们可以在进行每次轮转的时候&#xff0c;先将数组的最后一个数据的值存储起来&#xff0c;接着将数组中前n-1个数据依次向后移&#xff0c;最后将存储起来的值赋给数组中的第一个数据。 …

数据结构复习笔记

简答题 (3) 顺序表和链表的概念及异同 顺序表: 把逻辑上相邻的结点储存在物理位置上的相邻储存单元中&#xff0c;结点的逻辑关系由储存单元的邻接关系来体现.链表: 逻辑上相邻的结点存储再物理位置上非连续非顺序的存储单元中, 结点的逻辑关系由指向下一个结点的指针确保.相…

2024.6.10学习记录

1、代码随想录二刷 2、项目难点 review 3、计组复习

常见的api:BigDecima

一.计算中的小数 float和double占有的位置是有限的 二.BigDecima的作用 1.用于小数的精确计算 2.用来表示很大的小数 三.使用(传入小数) BigDecimal b1 new BigDecimal(0.01);BigDecimal b2 new BigDecimal(0.09);System.out.println(b1);System.out.println(b2); 不精确&…

C++面向对象程序设计 - 输入输出流进一步研究

在C中&#xff0c;输入输出流&#xff08;I/O&#xff09;是一个强大的特性&#xff0c;它允许程序与各种输入/输出设备&#xff08;如键盘、显示器、文件等&#xff09;进行交互。C标准库中的<iostream>头文件定义了基本的输入输出流类&#xff0c;如std::cin&#xff0…

流批一体计算引擎-9-[Flink]中的数量窗与时间窗

1 数量窗 1.1 数量滚动窗口 0基础学习PyFlink——个数滚动窗口(Tumbling Count Windows) 1.1.1 代码分析 Tumbling Count Windows是指按元素个数计数的滚动窗口。 滚动窗口是指没有元素重叠的窗口。 (1)构造了一个KeyedStream&#xff0c;用于存储word_count_data中的数据。…

creo学习一

设置好当前配置后&#xff0c;导出config配置文件&#xff0c;并覆盖掉此路径下的旧文件&#xff0c;使得新配置永久生效&#xff0c;这样每次打开软件都是新配置的设置&#xff1a; 系统颜色的导出&#xff1a; 打开版本的问题&#xff1a; 不能有弱尺寸&#xff1a; 注意&a…

【Android Studio】导入import android.support.v7.app.AppcompatActivity;时报错

一、问题描述 在进行安卓项目开发时使用import android.support.v7.app.AppcompatActivity;报错&#xff1a; 运行后会有乱码出现&#xff1a; 二、解决办法 将import android.support.v7.app.AppcompatActivity;改为import androidx.appcompat.app.AppCompatActivity;基本上…

代码随想录算法训练营第五十四 | ● 392.判断子序列 ● 115.不同的子序列

392.判断子序列 https://programmercarl.com/0392.%E5%88%A4%E6%96%AD%E5%AD%90%E5%BA%8F%E5%88%97.html class Solution { public:bool isSubsequence(string s, string t) {if(s.size()0 )return true;if(t.size()0)return false;vector<vector<int>> dp(s.size(…

学生信息管理(C语言)

学生信息管理 (1)问题描述 学生信息包括:学号,姓名,年龄,性别,出生年月,地址,电话,E-mail等。试设计一学生信息管理系统,使之能提供以下功能: 系统以菜单方式工作学生信息录入功能(学生信息用文件保存)---输入学生信息浏览功能---输出查询、排序功能---算法1、…

Zabbix6.0自动发现Linux服务器并添加主机

文章目录 一、整体流程二、操作过程 一、整体流程 Zabbix自动发现主机功能是Zabbix监控系统的一个重要功能&#xff0c;它能够自动发现并添加新的主机到监控系统中&#xff0c;从而减少人为繁琐的操作&#xff01; 步骤操作1️⃣ 第一步创建自动发现规则2️⃣ ​第二步创建自…

上汽集团25届暑期实习测评校招笔试题库已发(真题)

&#x1f4e3;上汽集团 25届暑期实习测评已发&#xff0c;正在申请的小伙伴看过来哦&#x1f440; ㊙️本次实习项目面向2025届国内外毕业生&#xff0c;开放了新媒体运营、销售策略、市场运营、物流、质量分析等岗位~ ✅测评讲解&#xff1a; &#x1f449;测评自收到起需在…

PawSQL优化 | 分页查询太慢?别忘了投影下推

​在进行数据库应用开发中&#xff0c;分页查询是一项非常常见而又至关重要的任务。但你是否曾因为需要获取总记录数的性能而感到头疼&#xff1f;现在&#xff0c;让PawSQL的投影下推优化来帮你轻松解决这一问题&#xff01;本文以TPCH的Q12为案例进行验证&#xff0c;经过Paw…

万能表单与AI的完美融合,打造个性化AI小程序

在人工智能技术日益成熟的今天&#xff0c;如何将AI智能与用户界面无缝结合&#xff0c;已成为软件开发领域的新挑战。MyCms 以其创新的“万能表单结合AI”功能&#xff0c;为开发者提供了一个全新的解决方案&#xff0c;让个性化AI小程序的开发变得前所未有的简单和高效。 一、…

powerdesigner各种字体设置

1、设置左侧菜单&#xff1a; 步骤如下&#xff1a; tools —> general options —> fonts —> defalut UI font ,选择字体样式及大小即可&#xff0c;同下图。 2、设置Table的字体大小 Tools------>Display Prefrences------>Table------->Format---------…

基于机器学习的锂电池RUL SOH预测

数据集为NASA锂电池数据集。 import datetimeimport numpy as npimport pandas as pdfrom scipy.io import loadmatfrom sklearn.preprocessing import MinMaxScalerfrom sklearn.metrics import mean_squared_errorfrom sklearn import metricsimport matplotlib.pyplot as p…

从GPU到ASIC,博通和Marvell成赢家

ASIC市场上&#xff0c;博通预计今年AI收入将达到110亿美元以上&#xff0c;主要来自与Google和Meta的合作&#xff1b;Marvell预计2028年AI收入将达到70亿至80亿美元&#xff0c;主要来自与Amazon和Google的合作。 随着芯片设计和系统复杂性的增加&#xff0c;科技大厂将更多地…

Python 全栈体系【四阶】(五十八)

第五章 深度学习 十三、自然语言处理&#xff08;NLP&#xff09; 3. 文本表示 3.1 One-hot One-hot&#xff08;独热&#xff09;编码是一种最简单的文本表示方式。如果有一个大小为V的词表&#xff0c;对于第i个词 w i w_i wi​&#xff0c;可以用一个长度为V的向量来表示…