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

spring中处理跨域的3种方案

前言

跨域是指一个域下的文件想要和另一个域下的资源发生HTTP通信时,浏览器出于安全限制所引发的问题。如果协议、子域名、主域名、端口有任何一个不同,都会出现跨域问题。

举个例子,如果一个网页来自https://www.example.com,那么它只能访问同域下的资源,如https://www.example.com/data.json。但如果它想访问https://api.example.com/data.json或https://www.other.com/data.json,就会因为跨域而被浏览器拦截。

解决

spring 中处理跨域的3种方案

  • 在需要配置跨域的接口上 使用 @CrossOrigin注解 当有多个接口时 需要配置多个 过于繁琐 不推荐
    @RestController
    public class TestController {@GetMapping("/hello")@CrossOrigin(origins = "localhost:8080",allowedHeaders = "*",methods = RequestMethod.GET,allowCredentials = "true",maxAge = 3600L)public String hello() {return "hello";}
    }    
    
  • 重写 WebMvcConfigurer#taddCorsMappings
@Configuration
public class CorsConfig implements WebMvcConfigurer {@Overridepublic void addCorsMappings(CorsRegistry registry) {registry.addMapping("/**").allowedHeaders("*").allowedMethods("*").allowedOrigins("*").allowCredentials(true).maxAge(3600);}
}
  • 配置 corsFilter
    在如下配置中 我们初始化了CorsConfiguration 并设置了属性 最后将其配置给 UrlBasedCorsConfigurationSource 最后使用 FilterRegistrationBean 注册 corsFilter (使用带UrlBasedCorsConfigurationSource 构造参数进行初始化) 并给corsFilter设置为最高优先级
@Configuration
public class CorsConfig {@Beanpublic FilterRegistrationBean<CorsFilter> corsFilter() {FilterRegistrationBean<CorsFilter> registrationBean = new FilterRegistrationBean<>();CorsConfiguration corsConfiguration = new CorsConfiguration();corsConfiguration.setAllowedHeaders(List.of("*"));corsConfiguration.setAllowedMethods(List.of("*"));corsConfiguration.setAllowedOrigins(List.of("http://localhost:8081"));corsConfiguration.setMaxAge(3600L);UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();source.registerCorsConfiguration("/**", corsConfiguration);registrationBean.setFilter(new CorsFilter(source));registrationBean.setOrder(Ordered.HIGHEST_PRECEDENCE);return registrationBean;}}

总结

汇总一下Spring中处理跨域的三种方案的优缺点:

  1. 使用 @CrossOrigin 注解 灵活 适用于需要跨域的接口不多的情况下。
  2. 重写 WebMvcConfigurer#taddCorsMappings 统一管理 支持给不同url 配置跨域规则 但是需要引入额外的配置类 本质上使用Interceptor 处理 处理顺序较为靠后
  3. 配置 corsFilter 统一管理 支持给不同url 配置跨域规则 但是需要引入额外的配置类 ,处理顺序相比较前面两者,并比较靠前。同时会增加接口过滤器的执行链路 (推荐使用)

这就是spring为我们提供的三种跨域方法 ,三种都可以解决问题 任选其中一种即可。需要说明的是:

注意:
@CrossOrigin 注解十 重写 addCorsMappings 方法同时配置,这两种方式中关于跨域的配置会自动合并.跨域在 Cors interceptor 中只处理了一次
@CrossOrigin 注解+ CorsFilter 同时配置,或者重写addCorsMappings 方法 + CorsFitler同时配置,都会导致跨域在 CorsInterceptor 和 CorsFilter 中各处理了一次,降低程序运行效率,这种组合不可取。


good day !!!

相关文章:

  • 深入理解linux文件系统与日志分析
  • 智能化改造的关键点
  • 不是我愿意孤独,而是周围找不到同类
  • 大模型之路,从菜鸟到模型大师只需要一步
  • 初出茅庐的小李博客之使用立创开发板(ESP32)连接到EMQX Platform【MQTT TLS/SSL 端口连接】
  • 如何构建最小堆?
  • 爬虫学习--18.反爬斗争 selenium(3)
  • Inno Setup磁盘跨越必须启用,因为程序大于21000000000
  • 解析Java中1000个常用类:Error类,你学会了吗?
  • 考CCIE的难点在哪?英语不好?
  • 等保系列之——网络安全等级保护测评工作流程及工作内容
  • 解决 git 命令 Problem with the SSL CA cert (path? access rights?)
  • 反射、类加载、静态代理,jdk动态代理,cglib代理
  • java8 stream流的用法
  • 命令模式(行为型)
  • Django 博客开发教程 8 - 博客文章详情页
  • flutter的key在widget list的作用以及必要性
  • Javascript设计模式学习之Observer(观察者)模式
  • js ES6 求数组的交集,并集,还有差集
  • Linux链接文件
  • nginx 配置多 域名 + 多 https
  • react-native 安卓真机环境搭建
  • Spring Cloud(3) - 服务治理: Spring Cloud Eureka
  • vue-router 实现分析
  • 关于 Linux 进程的 UID、EUID、GID 和 EGID
  • 基于游标的分页接口实现
  • 利用DataURL技术在网页上显示图片
  • 融云开发漫谈:你是否了解Go语言并发编程的第一要义?
  • 收藏好这篇,别再只说“数据劫持”了
  • 树莓派 - 使用须知
  • 我从编程教室毕业
  • C# - 为值类型重定义相等性
  • 新海诚画集[秒速5センチメートル:樱花抄·春]
  • ​水经微图Web1.5.0版即将上线
  • # MySQL server 层和存储引擎层是怎么交互数据的?
  • #Datawhale AI夏令营第4期#AIGC文生图方向复盘
  • #QT(一种朴素的计算器实现方法)
  • (附源码)springboot金融新闻信息服务系统 毕业设计651450
  • (附源码)springboot社区居家养老互助服务管理平台 毕业设计 062027
  • (附源码)ssm跨平台教学系统 毕业设计 280843
  • (四)Controller接口控制器详解(三)
  • (图文详解)小程序AppID申请以及在Hbuilderx中运行
  • .Net Core 中间件与过滤器
  • .net framework4与其client profile版本的区别
  • .NET Framework杂记
  • .net Stream篇(六)
  • .net打印*三角形
  • .NET国产化改造探索(三)、银河麒麟安装.NET 8环境
  • .net实现头像缩放截取功能 -----转载自accp教程网
  • .NET运行机制
  • /etc/fstab和/etc/mtab的区别
  • [023-2].第2节:SpringBoot中接收参数相关注解
  • [Android Pro] Notification的使用
  • [Android] Implementation vs API dependency
  • [BSGS算法]纯水斐波那契数列