当前位置: 首页 > news >正文

springboot处理跨域请求

在Spring Boot中处理跨域请求(CORS, Cross-Origin Resource Sharing)通常有几种方法。跨域请求是指从一个域名的网页去请求另一个域名下的资源。为了安全起见,浏览器会阻止这种请求,除非服务器明确允许。

方法一:使用@CrossOrigin注解

这是最简单的方法,直接在Controller类或方法上使用@CrossOrigin注解来指定允许跨域的来源。例如:

@RestController
@CrossOrigin(origins = "http://example.com")
public class MyController {@GetMapping("/hello")public String hello() {return "Hello World";}
}

如果要对所有来源开放,可以将origins属性设置为*

方法二:配置CORS全局设置

如果你需要更细粒度地控制跨域行为,或者希望整个应用都遵循相同的跨域策略,可以通过实现WebMvcConfigurer接口并重写addCorsMappings方法来全局配置CORS。

@Configuration
public class WebConfig implements WebMvcConfigurer {@Overridepublic void addCorsMappings(CorsRegistry registry) {registry.addMapping("/**").allowedOrigins("http://example.com").allowedMethods("GET", "POST", "PUT", "DELETE", "OPTIONS").allowedHeaders("*").allowCredentials(true).maxAge(3600);}
}

在这个例子中:

  • addMapping("/**") 表示对所有路径生效。
  • allowedOrigins 指定了允许的源。
  • allowedMethods 指定了允许的HTTP方法。
  • allowedHeaders 指定了允许的头信息。
  • allowCredentials 设置是否支持凭证(如cookies)。
  • maxAge 设置预检请求的有效期,单位为秒。

方法三:通过过滤器实现CORS

对于更复杂的场景,可能需要通过实现过滤器(Filter)来处理跨域请求。创建一个实现了Filter接口的类,并注册到Spring容器中。

@Component
public class CorsFilter implements Filter {@Overridepublic 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, authorization");if ("OPTIONS".equalsIgnoreCase(((HttpServletRequest) req).getMethod())) {response.setStatus(HttpServletResponse.SC_OK);} else {chain.doFilter(req, res);}}// 其他方法...
}

这种方法提供了最大的灵活性,但是也相对复杂一些。

选择哪种方式取决于你的具体需求。对于大多数简单的应用来说,使用@CrossOrigin注解或全局配置就足够了。对于更复杂的需求,考虑使用过滤器来实现更精细的控制。

http://www.lryc.cn/news/481102.html

相关文章:

  • S32G-VNP-RDB2开发环境搭建
  • 分布式唯一ID生成(二): leaf
  • 【开发工具】Git
  • 【go从零单排】结构嵌套struct embedding
  • Django 详细入门介绍
  • 万字长文解读深度学习——循环神经网络RNN、LSTM、GRU、Bi-RNN
  • HDR视频技术之二:光电转换与 HDR 图像显示
  • 【Linux】Linux入门实操——vim、目录结构、远程登录、重启注销
  • Redis的缓存问题与应对策略
  • Java项目实战II基于Spring Boot的智慧生活商城系统的设计与实现(开发文档+数据库+源码)
  • 每日一题之成绩排序
  • QT Widget:使用技巧
  • 深入Zookeeper节点操作:高级功能与最佳实践
  • 【C++】map和set的介绍及使用
  • 从0开始搭建一个生产级SpringBoot2.0.X项目(十)SpringBoot 集成RabbitMQ
  • GNU/Linux - /proc/sys/vm/drop_caches
  • ubuntu 22.04 如何调整进程启动后能打开的文件数限制
  • linux基础-完结(详讲补充)
  • LoRA:大型语言模型(LLMs)的低秩适应;低秩调整、矩阵的低秩与高秩
  • 游戏引擎学习第四天
  • GIT GUI和 GIT bash区别
  • 丹摩征文活动|Faster-Rcnn-训练与测试详细教程
  • 星期-时间范围选择器 滑动选择时间 最小粒度 vue3
  • 一条SQL查询语句的执行流程(MySQL)
  • linux基础——详细篇
  • 大数据学习10之Hive高级
  • MongoDB笔记01-概念与安装
  • ollama + fastGPT + m3e 本地部署指南
  • 【设计模式系列】享元模式(十五)
  • 2024大兴区火锅美食节即将开幕——品味多元火锅,点燃冬季消费热潮