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

本文主要是介绍深入探讨跨域请求(CORS):原理、解决方案与详细示例代码,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

深入探讨跨域请求(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 {@Overridepublic 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 {@Overridepublic 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技术核心学习团队。一起探索科技的未来,共同成长。

在这里插入图片描述

这篇关于深入探讨跨域请求(CORS):原理、解决方案与详细示例代码的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1049669

相关文章

部署Vue项目到服务器后404错误的原因及解决方案

《部署Vue项目到服务器后404错误的原因及解决方案》文章介绍了Vue项目部署步骤以及404错误的解决方案,部署步骤包括构建项目、上传文件、配置Web服务器、重启Nginx和访问域名,404错误通常是... 目录一、vue项目部署步骤二、404错误原因及解决方案错误场景原因分析解决方案一、Vue项目部署步骤

如何使用Java实现请求deepseek

《如何使用Java实现请求deepseek》这篇文章主要为大家详细介绍了如何使用Java实现请求deepseek功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1.deepseek的api创建2.Java实现请求deepseek2.1 pom文件2.2 json转化文件2.2

Java调用DeepSeek API的最佳实践及详细代码示例

《Java调用DeepSeekAPI的最佳实践及详细代码示例》:本文主要介绍如何使用Java调用DeepSeekAPI,包括获取API密钥、添加HTTP客户端依赖、创建HTTP请求、处理响应、... 目录1. 获取API密钥2. 添加HTTP客户端依赖3. 创建HTTP请求4. 处理响应5. 错误处理6.

Spring AI集成DeepSeek的详细步骤

《SpringAI集成DeepSeek的详细步骤》DeepSeek作为一款卓越的国产AI模型,越来越多的公司考虑在自己的应用中集成,对于Java应用来说,我们可以借助SpringAI集成DeepSe... 目录DeepSeek 介绍Spring AI 是什么?1、环境准备2、构建项目2.1、pom依赖2.2

Android 悬浮窗开发示例((动态权限请求 | 前台服务和通知 | 悬浮窗创建 )

《Android悬浮窗开发示例((动态权限请求|前台服务和通知|悬浮窗创建)》本文介绍了Android悬浮窗的实现效果,包括动态权限请求、前台服务和通知的使用,悬浮窗权限需要动态申请并引导... 目录一、悬浮窗 动态权限请求1、动态请求权限2、悬浮窗权限说明3、检查动态权限4、申请动态权限5、权限设置完毕后

在 Spring Boot 中使用 @Autowired和 @Bean注解的示例详解

《在SpringBoot中使用@Autowired和@Bean注解的示例详解》本文通过一个示例演示了如何在SpringBoot中使用@Autowired和@Bean注解进行依赖注入和Bean... 目录在 Spring Boot 中使用 @Autowired 和 @Bean 注解示例背景1. 定义 Stud

使用 sql-research-assistant进行 SQL 数据库研究的实战指南(代码实现演示)

《使用sql-research-assistant进行SQL数据库研究的实战指南(代码实现演示)》本文介绍了sql-research-assistant工具,该工具基于LangChain框架,集... 目录技术背景介绍核心原理解析代码实现演示安装和配置项目集成LangSmith 配置(可选)启动服务应用场景

oracle DBMS_SQL.PARSE的使用方法和示例

《oracleDBMS_SQL.PARSE的使用方法和示例》DBMS_SQL是Oracle数据库中的一个强大包,用于动态构建和执行SQL语句,DBMS_SQL.PARSE过程解析SQL语句或PL/S... 目录语法示例注意事项DBMS_SQL 是 oracle 数据库中的一个强大包,它允许动态地构建和执行

Goland debug失效详细解决步骤(合集)

《Golanddebug失效详细解决步骤(合集)》今天用Goland开发时,打断点,以debug方式运行,发现程序并没有断住,程序跳过了断点,直接运行结束,网上搜寻了大量文章,最后得以解决,特此在这... 目录Bug:Goland debug失效详细解决步骤【合集】情况一:Go或Goland架构不对情况二:

在MySQL执行UPDATE语句时遇到的错误1175的解决方案

《在MySQL执行UPDATE语句时遇到的错误1175的解决方案》MySQL安全更新模式(SafeUpdateMode)限制了UPDATE和DELETE操作,要求使用WHERE子句时必须基于主键或索引... mysql 中遇到的 Error Code: 1175 是由于启用了 安全更新模式(Safe Upd