Loading [MathJax]/jax/input/TeX/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >深入探讨跨域请求(CORS):原理、解决方案与详细示例代码

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

作者头像
默 语
发布于 2024-11-22 00:29:08
发布于 2024-11-22 00:29:08
41603
代码可运行
举报
文章被收录于专栏:JAVAJAVA
运行总次数:3
代码可运行

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

摘要

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

引言

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

正文内容

什么是跨域?

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

为什么会有跨域问题?

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

示例代码

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// 跨域请求示例代码
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注解,允许特定域名的跨域请求:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@RestController
@CrossOrigin(origins = "http://example.com")
public class MyController {
    
    @GetMapping("/api/data")
    public ResponseEntity<String> getData() {
        return ResponseEntity.ok("Hello, World!");
    }
}
详细描述:
  • @RestController:这是一个组合注解,相当于同时使用@Controller@ResponseBody。它表示该类中的所有方法都会返回JSONXML格式的数据。
  • @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来全局允许跨域请求。这种方式适用于需要统一配置跨域策略的场景:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@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

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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,可以进一步自定义跨域请求的行为。

小结

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

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-06-10,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
SpringBoot如何解决跨域问题?
跨域问题是Web开发中常见的问题之一,特别是在前后端分离的项目中。Spring Boot作为一个流行的Java后端框架,提供了多种方式来解决跨域问题。本文将深入探讨Spring Boot如何解决跨域问题,包括原理分析、代码实现和示例展示。
程序猿川子
2024/11/25
4580
SpringBoot如何解决跨域问题?
CORS跨域问题及解决方案详解
CORS(Cross-Origin Resource Sharing,跨域资源共享)跨域问题源于浏览器的同源策略。同源策略是浏览器的一种安全机制,它要求浏览器在访问一个资源时,该资源的协议、域名和端口必须与当前页面的协议、域名和端口完全一致,否则就会被视为跨域请求,浏览器会对这类请求进行限制。
威哥爱编程
2025/02/25
6020
盘点 Spring Boot 解决跨域请求的几种方式
之所以会出现这个错误,是因为浏览器出于安全的考虑,采用同源策略的控制,防止当前站点恶意攻击 web 服务器盗取数据。
潘志的技术笔记
2024/07/02
2910
盘点 Spring Boot 解决跨域请求的几种方式
Spring Boot 中解决跨域的多种方式
在开发Web应用时,经常会遇到跨域问题,这给开发者带来了不少困扰。在本文中,我将探讨Spring Boot中解决跨域问题的几种常见方式,包括使用@CrossOrigin注解、自定义WebMvcConfigurer以及使用Filter进行跨域配置。通过深入了解这些方法,我们能够更好地解决跨域问题,保证应用的稳定性和安全性。
默 语
2024/11/20
1430
Spring Boot 中解决跨域的多种方式
Springboot处理CORS跨域请求的三种方法
浏览器出于安全的考虑,使用 XMLHttpRequest对象发起 HTTP请求时必须遵守同源策略,否则就是跨域的HTTP请求,默认情况下是被禁止的。换句话说,浏览器安全的基石是同源策略。
陈哈哈
2020/07/03
17.3K0
Java如何解决跨域问题
跨域,指的是浏览器不能执行其他网站的脚本,它是由浏览器的同源策略所造成的,是浏览器对于JavaScript所定义的安全限制策略。
Vincent-yuan
2021/10/13
2K0
SpringBoot 中实现跨域的5种方式
出于浏览器的同源策略限制。同源策略(Sameoriginpolicy)是一种约定,它是浏览器最核心也最基本的安全功能,如果缺少了同源策略,则浏览器的正常功能可能都会受到影响。可以说Web是构建在同源策略基础之上的,浏览器只是针对同源策略的一种实现。2021Java面试宝典
程序员白楠楠
2021/02/19
4.2K0
JAVA | Java 解决跨域问题 花式解决跨域问题
我们在开发过程中经常会遇到前后端分离而导致的跨域问题,导致无法获取返回结果。跨域就像分离前端和后端的一道鸿沟,君在这边,她在那边,两两不能往来.
双鬼带单
2020/07/27
12.3K0
JAVA | Java 解决跨域问题 花式解决跨域问题
Spring Boot 实现跨域的 5 种方式,总有一种适合你,建议收藏!!
点击关注公众号,Java干货及时送达 一、为什么会出现跨域问题 出于浏览器的同源策略限制。同源策略(Sameoriginpolicy)是一种约定,它是浏览器最核心也最基本的安全功能,如果缺少了同源策略,则浏览器的正常功能可能都会受到影响。可以说Web是构建在同源策略基础之上的,浏览器只是针对同源策略的一种实现。 同源策略会阻止一个域的javascript脚本和另外一个域的内容进行交互。所谓同源(即指在同一个域)就是两个页面具有相同的协议(protocol),主机(host)和端口号(port) 二、什么是
Java技术栈
2022/07/26
5.8K0
Spring Boot 实现跨域的 5 种方式,总有一种适合你,建议收藏!!
vue跨域解决方案 简书_springboot允许跨域
1.方法一:@CrossOrigin 注意: 1、springMVC的版本要在4.2或以上版本才支持@CrossOrigin 2、非@CrossOrigin没有解决跨域请求问题,而是不正确的请求导致无法得到预期的响应,导致浏览器端提示跨域问题。 3、在Controller注解上方添加@CrossOrigin注解后,仍然出现跨域问题,解决方案之一就是:在@RequestMapping注解中没有指定Get、Post方式,具体指定后,问题解决。其中@CrossOrigin中的2个参数:origins : 允许可访问的域列表 maxAge:准备响应前的缓存持续的最大时间(以秒为单位)。可以配置在Controller上 也可以配置在方法上。
全栈程序员站长
2022/09/29
3210
SpringBoot系列(七) 分分钟学会SpringBoot多种跨域解决方式​
 跨域是指不同域名之间的相互访问,这是由浏览器的同源策略决定的,是浏览器对JavaScript施加的安全措施,防止恶意文件破坏。
全栈学习笔记
2022/03/31
8020
SpringBoot系列(七) 分分钟学会SpringBoot多种跨域解决方式​
Spring Boot 解决跨域问题的 3 种方案!
前后端分离大势所趋,跨域问题更是老生常谈,随便用标题去google或百度一下,能搜出一大片解决方案,那么为啥又要写一遍呢,不急往下看。
后端码匠
2021/01/06
3560
Spring Boot 解决跨域问题的 3 种方案!
前后端分离大势所趋,跨域问题更是老生常谈,随便用标题去google或百度一下,能搜出一大片解决方案,那么为啥又要写一遍呢,不急往下看。
Java技术江湖
2021/01/06
6680
SpringBoot跨域配置「建议收藏」
简单而言,跨域请求就是当一台服务器资源从另一台服务器(不同 的域名或者端口)请求一个资源或者接口,就会发起一个跨域 HTTP 请求。举个简单的例子,从http://www.baidu.com,发送一个 Ajax 请求,请求地址是 http://www.taobao.com下面的一个接口,这就是发起了一个跨域请求,在不做任何处理的情况下,显然当前跨域请求是无法被成功请求,因为浏览器基于同源策略会对跨域请求做一定的限制。
全栈程序员站长
2022/09/13
8910
Springboot解决Ajax跨域的三种方式
这篇文章不华丽,但比较实用,能解决不少大家实际业务中的问题。大家可以收藏起来,以备用时之需!
业余草
2020/12/23
9150
Springboot解决Ajax跨域的三种方式
SpringBoot跨域配置
跨域:指的是浏览器不能执行其他网站的脚本。它是由浏览器的同源策略造成的,是浏览器对javascript施加的安全限制。
小沐沐吖
2022/09/22
1.3K0
SpringBoot跨域配置
Spring Boot或Spring MVC前后端分离的项目跨域问题的解决方案
那么跨域问题就是CORS全称Cross-Origin Resource Sharing,意为跨域资源共享。当一个资源去访问另一个不同域名或者同域名不同端口的资源时,就会发出跨域请求。如果此时另一个资源不允许其进行跨域资源访问,那么访问的那个资源就会遇到跨域问题。
Java技术债务
2022/08/09
5240
Spring Boot:处理跨域问题
同源策略(Same origin policy)是一种约定,它是浏览器最核心也最基本的安全功能,如果缺少了同源策略,则浏览器的正常功能可能都会受到影响。可以说Web是构建在同源策略基础之上的,浏览器只是针对同源策略的一种实现。
HLee
2021/07/03
2.1K0
Spring Boot:处理跨域问题
SpringBoot跨域及三种解决方式
我们先了解下【域】的定义:协议 + 域名 + 端口。三者完全相同则为同域,反之有其一不同均为不同域。那么,什么是跨域请求?当前【发起请求】的域和【请求指向】的域属于不同域时,该次请求称之为跨域请求。简单说A应用只能访问A应用后台传来数据,B应用只能访问B应用后台传来的数据,如果A应用用Ajax获取数据时的URL地址中的协议、端口、域名其中有一个和B应用对应的话,则是A应用跨域了想获取B应用数据,是不允许的。在谈跨域之前,我们先来看看浏览器的同源策略。
崩天的勾玉
2021/12/24
24.3K1
SpringBoot跨域及三种解决方式
跨域问题(CORS / Access-Control-Allow-Origin)
最近在项目中,调用Eureka REST接口时,出现了CORS跨越问题(Cross-origin resource sharing),在此与大家进行分享,避免多走些弯路。
xcbeyond
2020/10/27
2.2K2
跨域问题(CORS / Access-Control-Allow-Origin)
相关推荐
SpringBoot如何解决跨域问题?
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验