spring boot3解决跨域的几种方式

2024-03-02 05:20

本文主要是介绍spring boot3解决跨域的几种方式,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

⛰️个人主页:     蒾酒

🔥系列专栏:《spring boot实战》

🌊山高路远,行路漫漫,终有归途。


目录

1.前言

2.何为跨域

3.跨域问题出现特征

4.方式一:使用 @CrossOrigin 注解

5.方式二:自定义 WebMvcConfigurer

6.方式3:使用 Filter 进行跨域配置

7.最后


1.前言

本文介绍了spring boot中三种解决跨域问题的方式,坚持看完相信对你有帮助。

同时欢迎订阅springboot系列专栏,持续分享spring boot的使用经验。

2.何为跨域

跨域问题是指在 Web 开发中,一个网页的 JavaScript 代码通过 AJAX 请求后端服务器接口时,如果请求的目标地址当前页面的地址不在同一个域(域名端口协议任何一项不同),就会产生跨域问题。这种情况下,根据浏览器的安全机制(同源策略)就会会限制页面的跨域请求,以防止恶意网站对其他网站的访问和操作,保护用户信息安全。

3.跨域问题出现特征

1.没有状态码信息

如果你看到某个请求似乎“失败了”,但并没有具体的HTTP状态码,这可能是因为浏览器出于安全原因阻止了对响应的访问。在开发者工具的网络(Network)面板中,这样的请求可能会被标记为“cancelled”或者没有显示状态码。

2.控制台报错

浏览器通常会在控制台(Console)中打印一条错误消息,说明因为CORS策略,请求被阻止了

4.方式一:使用 @CrossOrigin 注解

这是最直接简单的方式,可以精确控制所有接口

使用方法:在你的控制器类或者控制器方法上添加 @CrossOrigin 注解,可以精确控制某个控制器类、以及下面的某个方法的允许跨域的来源、允许的请求头、允许的请求方法等配置。

示例代码:

@RestController
@RequestMapping("/user")
@CrossOrigin(origins = "*")//允许所有来源的请求跨域
@Tag(name = "用户模块")
public class UserController {private final UserService userService;public UserController(UserService userService) {this.userService = userService;}@PostMapping("/login")@Operation(summary = "用户登录")public UserLoginVO login(@RequestBody @Validated UserLoginDTO userLoginDTO) {return userService.login(userLoginDTO);}}

这种方式解决跨域需要在每个控制器上加注解,属于重复劳动对于不需要精确控制的场景属于重复劳动。可以看下下面方式

5.方式二:自定义 WebMvcConfigurer

通过实现 WebMvcConfigurer 接口来自定义 WebMvc 配置,并覆盖 addCorsMappings 方法以配置全局跨域规则。

示例代码:

import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.CorsRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;/*** @author mijiupro*/
@Configuration
public class WebConfig implements WebMvcConfigurer {@Overridepublic void addCorsMappings(CorsRegistry registry) {registry.addMapping("/**") // 对所有路径生效.allowedOrigins("*") //允许所有源地址// .allowedOrigins("https://mijiupro.com","https://mijiu.com ") // 允许的源地址(数组).allowedMethods("GET", "POST", "PUT", "DELETE") // 允许的请求方法.allowedHeaders("*"); // 允许的请求头}
}

这种方式实现了全局的配置,但是无法细腻到控制某个方法

6.方式3:使用 Filter 进行跨域配置

创建一个跨域过滤器,在其中设置允许的跨域规则,并将该过滤器添加到 Spring Boot 的过滤器链中。

示例代码:

import jakarta.servlet.*;
import jakarta.servlet.http.HttpServletResponse;
import org.springframework.stereotype.Component;import java.io.IOException;/*** @author mijiupro*/
@Component
public class CorsFilter implements Filter {@Overridepublic void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)throws IOException, ServletException {// 将 ServletResponse 转换为 HttpServletResponseHttpServletResponse httpResponse = (HttpServletResponse) response;// 设置允许跨域请求的源地址httpResponse.setHeader("Access-Control-Allow-Origin", "https://mijiupro.com");// 设置允许的请求方法httpResponse.setHeader("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE");// 设置允许的请求头httpResponse.setHeader("Access-Control-Allow-Headers", "*");// 继续执行 Filter 链chain.doFilter(request, response);}
}

7.最后

这三种spring boot中解决跨域的方式通常第二种跟第一种使用的最多,对于不需要细腻控制到某个接口方法的推荐使用第二种全局配置解决。

这篇关于spring boot3解决跨域的几种方式的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

Java中的String.valueOf()和toString()方法区别小结

《Java中的String.valueOf()和toString()方法区别小结》字符串操作是开发者日常编程任务中不可或缺的一部分,转换为字符串是一种常见需求,其中最常见的就是String.value... 目录String.valueOf()方法方法定义方法实现使用示例使用场景toString()方法方法

Java中List的contains()方法的使用小结

《Java中List的contains()方法的使用小结》List的contains()方法用于检查列表中是否包含指定的元素,借助equals()方法进行判断,下面就来介绍Java中List的c... 目录详细展开1. 方法签名2. 工作原理3. 使用示例4. 注意事项总结结论:List 的 contain

Java实现文件图片的预览和下载功能

《Java实现文件图片的预览和下载功能》这篇文章主要为大家详细介绍了如何使用Java实现文件图片的预览和下载功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... Java实现文件(图片)的预览和下载 @ApiOperation("访问文件") @GetMapping("

Spring Boot + MyBatis Plus 高效开发实战从入门到进阶优化(推荐)

《SpringBoot+MyBatisPlus高效开发实战从入门到进阶优化(推荐)》本文将详细介绍SpringBoot+MyBatisPlus的完整开发流程,并深入剖析分页查询、批量操作、动... 目录Spring Boot + MyBATis Plus 高效开发实战:从入门到进阶优化1. MyBatis

SpringCloud动态配置注解@RefreshScope与@Component的深度解析

《SpringCloud动态配置注解@RefreshScope与@Component的深度解析》在现代微服务架构中,动态配置管理是一个关键需求,本文将为大家介绍SpringCloud中相关的注解@Re... 目录引言1. @RefreshScope 的作用与原理1.1 什么是 @RefreshScope1.

Java并发编程必备之Synchronized关键字深入解析

《Java并发编程必备之Synchronized关键字深入解析》本文我们深入探索了Java中的Synchronized关键字,包括其互斥性和可重入性的特性,文章详细介绍了Synchronized的三种... 目录一、前言二、Synchronized关键字2.1 Synchronized的特性1. 互斥2.

Spring Boot 配置文件之类型、加载顺序与最佳实践记录

《SpringBoot配置文件之类型、加载顺序与最佳实践记录》SpringBoot的配置文件是灵活且强大的工具,通过合理的配置管理,可以让应用开发和部署更加高效,无论是简单的属性配置,还是复杂... 目录Spring Boot 配置文件详解一、Spring Boot 配置文件类型1.1 applicatio

使用Sentinel自定义返回和实现区分来源方式

《使用Sentinel自定义返回和实现区分来源方式》:本文主要介绍使用Sentinel自定义返回和实现区分来源方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Sentinel自定义返回和实现区分来源1. 自定义错误返回2. 实现区分来源总结Sentinel自定

Java中StopWatch的使用示例详解

《Java中StopWatch的使用示例详解》stopWatch是org.springframework.util包下的一个工具类,使用它可直观的输出代码执行耗时,以及执行时间百分比,这篇文章主要介绍... 目录stopWatch 是org.springframework.util 包下的一个工具类,使用它

Java进行文件格式校验的方案详解

《Java进行文件格式校验的方案详解》这篇文章主要为大家详细介绍了Java中进行文件格式校验的相关方案,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录一、背景异常现象原因排查用户的无心之过二、解决方案Magandroidic Number判断主流检测库对比Tika的使用区分zip