首页 > 其他分享 >Springboot 开发 -- 跨域问题技术详解

Springboot 开发 -- 跨域问题技术详解

时间:2024-06-01 10:00:55浏览次数:23  
标签:http 请求 -- 跨域 允许 com public Springboot

一、跨域的概念

跨域访问问题指的是在客户端浏览器中,由于安全策略的限制,不允许从一个源(域名、协议、端口)直接访问另一个源的资源。当浏览器发起一个跨域请求时,会被浏览器拦截,并阻止数据的传输。

这种限制是为了保护用户的隐私和安全,防止恶意网站利用用户的浏览器向其他网站发送请求并获取敏感信息。

以下是跨域的一些常见场景:

  • 不同域名:当页面的域名与请求的资源的域名不一致时,会触发跨域问题。例如,页面的域名为http://a.com,而请求的资源的域名为http://b.com。
  • 不同协议:当请求的资源的协议与页面的协议不一致时,也会引发跨域问题。例如,页面使用https://a.com访问资源http://a.com。
  • 不同端口:如果请求的资源的端口与页面的端口不同,同样会导致跨域问题。例如,页面使用http://a.com:8080请求资源http://a.com:8090。

二、跨域问题解决方案

Spring Boot提供了几种配置CORS策略的方法,下面我们将逐一介绍:

方法一:使用 @CrossOrigin 注解

  1. 对于单个Controller或方法,可以使用@CrossOrigin注解来允许跨域请求。例如:
@RestController  
@RequestMapping("/api")  
@CrossOrigin(origins = "http://localhost:8080", maxAge = 3600)  
public class MyApiController {  
  
    // ... 方法定义  
}

或者,你也可以在方法级别使用@CrossOrigin注解:

@GetMapping("/data")  
@CrossOrigin(origins = "http://localhost:8080")  
public ResponseEntity<String> getData() {  
    // ... 方法实现  
}

方法二: 全局配置 CORS

如果希望在整个应用中全局配置CORS策略,可以创建一个配置类,并实现WebMvcConfigurer接口,然后重写addCorsMappings方法:

@Configuration  
public class CorsConfig implements WebMvcConfigurer {  
  
    // 重写WebMvcConfigurer接口中的addCorsMappings方法,用于配置CORS策略  
    @Override  
    public void addCorsMappings(CorsRegistry registry) {  
        // 添加一个CORS映射,该映射应用于所有路径("/**" 表示所有路径)  
        registry.addMapping("/**")  
  
                // 允许来自以下来源的请求(多个来源以逗号分隔)  
                .allowedOrigins("http://localhost:8080", "http://example.com")  
  
                // 允许使用以下HTTP方法(多个方法以逗号分隔)  
                .allowedMethods("GET", "POST", "PUT", "DELETE")  
  
                // 允许携带以下请求头('*' 表示允许所有请求头)  
                .allowedHeaders("*")  
                
				// 是否允许携带用户凭据(如 cookies、HTTP 认证及客户端 SSL 证明等)
				.allowCredentials(false)
  
                // 预检请求的缓存时间(以秒为单位),浏览器将在这个时间内缓存预检请求的响应  
                .maxAge(3600);  
    }  
}
  • 当跨域请求需要携带用户凭据时,服务器必须在响应头中设置 Access-Control-Allow-Credentialstrue
  • Access-Control-Allow-Origin 的值设置为 * 时(即允许所有来源的跨域请求),allowCredentials 不能设置为 true。因为出于安全考虑,浏览器不允许携带凭据的跨域请求被发送到通配符源。

在上面的例子中,我们允许了所有路径(/**)来自http://localhost:8080和http://example.com的跨域请求,并指定了允许的HTTP方法和请求头。

方法三:使用 Filter 过滤器配置

@Configuration
public class CorsFilter implements Filter {  
  
    @Override  
    public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain)  
            throws IOException, ServletException {  
        HttpServletResponse response = (HttpServletResponse) res;  
        response.setHeader("Access-Control-Allow-Origin", "*");  
        response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE");  
        response.setHeader("Access-Control-Max-Age", "3600");  
        response.setHeader("Access-Control-Allow-Headers", "x-requested-with");  
        chain.doFilter(req, res);  
    }  
  
    // ... 其他方法实现  
    @Override
    public void destroy() {
    }
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
    }
}

利用过滤器配置实现跨域,还有另外一种方法:

@Configuration
public class Filter {
    @Bean
    public FilterRegistrationBean corsFilter() {
        UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
        CorsConfiguration config = new CorsConfiguration();
        config.setAllowCredentials(true);
        config.addAllowedOrigin("http://localhost:8080");//*表示允许所有
        config.addAllowedHeader("*");
        config.addAllowedMethod("*");
        source.registerCorsConfiguration("/**", config); // CORS 配置对所有接口都有效
        FilterRegistrationBean bean = new FilterRegistrationBean(new CorsFilter(source));
        bean.setOrder(0);
        return bean;
    }

}

标签:http,请求,--,跨域,允许,com,public,Springboot
From: https://blog.csdn.net/dazhong2012/article/details/139334750

相关文章

  • 5种方法,教你判断线程池是否全部完成
    5种方法,教你判断线程池是否全部完成前言isTerminated方式getCompletedTaskCountCountDownLatch计数器CountDownLatch概述维护一个公共计数Future判断任务执行状态前言最近写代码的时候用到了CountDownLatch计数器,然后顺便想了想判断线程池全部结束有多少种方......
  • 设计模式定义
    一.设计模式的分类1.按照目的创建型:负责对象的创建结构型:处理类与对象间的组合行为型:类与对象交互中的职责分配2.按照范围类模式:处理类与子类的静态关系对象模式:处理对象间的动态关系 二.设计模式的定义创建型模式简单工厂模式提供一个工厂类,根据传入参数来决定......
  • 参数设置错误导致的 OOM
    参数设置错误导致的OOM前言事故分析事故原因事故复盘前言2024年5月10日14时19分,C公司开发人员向A公司开发人员反映某开放接口从2024年5月10日14时许开始无法访问和使用。该系统为某基础数据接口服务,基于HTTP协议进行通信。按照惯例,首先排查......
  • WaEdge是什么?
    WaEdge是一套开源的工业边缘平台软件解决方案,主要功能包含如下:工业自动化控制:提供领先的IEC61131-3的PLC编程解决方案,使用WebAssembly技术首家支持IEC61131-3与多种计算机语言(C/C++/Rust/Go..)混合编译,混合源码调试。IDE基于vscode,提供现代的开发体验。工业设备连接:使用插件方......
  • 运用JavaScript代码,使用Three.js框架在网页中实现3D效果,零基础入门Three.js,包含具体实
    不经意间看到了某个大佬做的网站~实在是太帅啦!查了查实现该效果的技术——原来是Three.js如果你也感兴趣的话,那就让我们来从零开始学习Three.js动态3D效果吧✨一、了解Three.js是基于原生WebGL封装运行的三维引擎,在所有WebGL引擎中,Three.js是国内文资料最多、使......
  • 内存取证例题及Volatility2.6的使用(含命令详细解析)
    文章目录一、背景二、什么是内存取证?三、参考文章四、工具及题目五、解析1、哪个Volatility配置文件最适合这台机器?拓展1.12、获取镜像时有多少个进程在运行?拓展1.23、cmd.exe的进程ID是什么?4、最可疑的进程名称是什么?拓展1.35、哪一个进程被注入的可能性最高?6、最近......
  • 海外媒体发稿:打造个人品牌的2个必备宣发套餐-华媒舍
    个人品牌在现代社会中扮演着关键的角色,它可以帮助我们在职场竞争中脱颖而出。但是,要想打造一个成功的个人品牌,并不是一件容易的事情。在这篇文章中,我将为你介绍两个必备的宣发套餐,让你成为行家。1. 社交媒体宣发套餐如今,社交媒体已成为了人们日常生活中不可或缺的一部分。利......
  • 项目成本管理
    目录1.概述2.成本管理基础3.成本管理的四个过程4.应用场景5.小结1.概述项目成本管理是项目管理中的一个重要环节,旨在确保项目能够在预算范围内完成。其主要目标是通过适当的计划、估算、预算编制和控制,将项目的实际支出保持在批准的预算范围内。项目成本管理涉及确定......
  • 如何判断自己的情商高低?
    什么是情商?情商(简称为EQ),也叫情绪智力,和我们通常提到的智商智力有所不同(侧重于理性思维),情商更贴近实际生活,如:情绪识别和自我管理,自我调节能力,同理心,以及人际交往能力等多个方面。情商高的人能够更好的适应生活环境,能有效的沟通,应对各种压力,能管理和调节自己的情绪。情商测试-......
  • 微信公众号【原子与分子模拟】: 熔化温度 + 超导电性 + 电子化合物 + 分子动力学模拟 +
    往期内容主要涵盖: 熔化温度 + 超导电性 + 电子化合物 + 分子动力学模拟 + 第一性原理计算 + 数据处理程序【1】熔化温度 +分子动力学+LAMMPS相关内容【文献分享】分子动力学模拟+LAMMPS+熔化温度+晶体缺陷+熔化方法LAMMPS文献:金属熔化行为的局域......