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

gateway之跨域处理

文章目录

  • 什么是跨域
    • 跨域带来的问题
  • gateway解决跨域
    • 解决跨域的其他方式比较
    • 代码示例
  • 总结提升

什么是跨域

跨域(Cross-Origin)是指在浏览器中,当一个Web应用程序试图访问与其所属页面不同的源(origin)的资源时,浏览器会对这种行为进行安全限制,并阻止一些跨域请求,以保护用户的数据安全。

在浏览器遵循同源策略的限制下,同一个源的脚本只能访问相同源下的资源,不能访问其他源下的资源。同源策略通过限制跨域请求,防止恶意网站通过跨站脚本攻击(XSS)和跨站请求伪造(CSRF)等手段盗取用户的敏感信息或进行其他恶意行为。

通常情况下,如果一个请求的协议、主机或端口任意一个与当前页面的源(即协议、主机和端口)不同,则该请求就被认为是跨域请求。

跨域带来的问题

跨域请求受到同源策略(Same-Origin Policy)的限制,主要出于安全考虑。同源策略限制了跨域请求对其他源的读取访问,防止恶意网站窃取用户数据。这种限制导致跨域请求无法直接进行,而带来以下问题:

AJAX请求被拒绝:浏览器会阻止在跨域请求中使用XMLHttpRequest对象进行通信。
Cookie不可用:跨域请求默认不会发送源站的Cookie信息,导致无法验证用户身份。
访问被拒绝:跨域请求可能会受到服务器的访问控制策略阻止。

gateway解决跨域

Gateway(网关)是一种中间层服务,位于客户端和后端服务之间。它负责请求的转发、路由和协议转换等工作,并提供了跨域处理的解决方案。以下是Gateway解决跨域问题的主要方式:

反向代理:Gateway可以作为后端服务的反向代理,将客户端的请求转发到目标服务上。由于Gateway与后端服务在同一域内,因此不存在跨域问题。
跨域资源共享(CORS):Gateway可以配置CORS策略,允许特定域下的请求进行跨域访问。通过在响应头中添加Access-Control-Allow-Origin字段,指定允许跨域请求的域名,实现跨域访问。
JSONP代理:Gateway可以充当JSONP的代理,在服务端发起对目标服务的请求,然后返回给客户端一个回调函数包裹的响应数据。通过动态创建

解决跨域的其他方式比较

在这里插入图片描述

代码示例

@Component
@Order(2)
public class CorsResponseHeaderFilter implements GlobalFilter {private static final String ANY = "*";@Override@SuppressWarnings("serial")public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {return chain.filter(exchange).then(Mono.fromRunnable(() -> {exchange.getResponse().getHeaders().entrySet().stream().filter(kv -> (kv.getValue() != null && kv.getValue().size() > 1)).filter(kv -> (kv.getKey().equals(HttpHeaders.ACCESS_CONTROL_ALLOW_ORIGIN)|| kv.getKey().equals(HttpHeaders.ACCESS_CONTROL_ALLOW_CREDENTIALS)|| kv.getKey().equals(HttpHeaders.VARY))).forEach(kv ->{// Vary只需要去重即可if(kv.getKey().equals(HttpHeaders.VARY)) {kv.setValue(kv.getValue().stream().distinct().collect(Collectors.toList()));} else{List<String> value = new ArrayList<>();if(kv.getValue().contains(ANY)){  //如果包含*,则取*value.add(ANY);kv.setValue(value);}else{value.add(kv.getValue().get(0)); // 否则默认取第一个kv.setValue(value);}}});}));}
}

在这段代码中,通过实现GlobalFilter接口并使用@Component注解,将该类作为一个全局过滤器进行注册。同时使用@Order(2)注解来指定该过滤器的执行顺序。

在filter方法中,首先调用chain.filter(exchange)将请求转发给下一个过滤器或目标服务处理。然后通过then方法和Mono.fromRunnable创建一个新的Mono,在请求完成后执行一些操作。

在这个新的Mono中,我们获取到响应对象ServerHttpResponse,然后遍历响应头的键值对。针对部分特定的响应头,进行以下处理:

对于Access-Control-Allow-Origin、Access-Control-Allow-Credentials和Vary这三个响应头,我们判断其值是否存在且长度大于1(即有多个值)。如果满足条件,我们对其进行相应的处理。
如果是Vary头,则将其值去重,即去除重复的值。
如果是Access-Control-Allow-Origin或Access-Control-Allow-Credentials头,将其值设置为一个新的包含只有一个元素的列表。
如果原始值中包含通配符*,则新列表只包含一个元素*(即保持通配符不变)。
否则,新列表只包含原始值的第一个元素(即保持原样)。
通过这些处理,我们实现了对跨域请求响应头的筛选和修改,确保在跨域请求中返回符合要求的响应头,以便客户端能够正常访问跨域资源。

总结提升

跨域是浏览器限制网页脚本访问不同域名下资源的安全机制。同源策略要求网页脚本只能访问与其所在网页具有相同协议、域名和端口的资源。这种限制是为了保护用户的隐私和安全,防止恶意网站获取用户的敏感信息。

为了解决跨域请求的问题,浏览器提供了跨域资源共享(CORS)等机制。CORS允许服务器在响应中设置特定的HTTP头,以授权其他域名的请求访问资源。通过在响应头中添加Access-Control-Allow-Origin字段,服务器可以指定允许访问的域名。这样,浏览器就可以根据响应头的设置,决定是否允许跨域请求。

除了CORS,还有其他一些解决跨域请求的方法,如JSONP。JSONP通过动态创建

跨域是一个常见的开发问题,了解跨域的原理和解决方法对于开发人员来说是很重要的。通过合理使用CORS和其他跨域解决方案,我们可以在保护用户安全的前提下,实现不同域名之间的数据交互。

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

相关文章:

  • uniapp 实现不同用户展示不同的tabbar(底部导航栏)
  • 线性归一化是什么,用python实现数据的线性归一化
  • 超级好用绘图工具(Draw.io+Github)
  • 全国职业技能大赛云计算--高职组赛题卷③(私有云)
  • Redis SCAN命令操作实战(详细)
  • 计网第五章(运输层)(六)(TCP可靠传输的实现)
  • 酒店外卖小程序商城的作用是什么
  • 居家养老一键通的功能
  • 海外代理IP是什么?如何使用?
  • mmdetection v3避坑
  • 备份服务器数据库并保存到Git仓库
  • 尚硅谷wepack课程学习笔记
  • c++模版元编程-可变参数模版
  • pcl--第十节 点云曲面重建
  • 【力扣-每日一题】2560. 打家劫舍 IV
  • vue简单案例----小张记事本
  • 爬虫获取接口数据
  • 私域流量的变现方式,你知道多少?
  • Webpack配置entry修改入口文件或打包多个文件
  • Mac mini2014(装的windows)重装回MacOS
  • 珠海建筑模板厂家-能强优品木业:为您提供优质建筑模板解决方案
  • 图像识别技术如何改变智能家居的体验?
  • 前端中blob文件流和base64的区别
  • MySQL详解六:备份与恢复
  • 什么样的应用程序适合使用Flutter开发桌面?
  • 02强化学习基本概念
  • 笔记2.2:网络应用基本原理
  • 生活垃圾数据集(YOLO版)
  • 操作系统篇之虚拟内存
  • 浅谈SpringMVC的请求流程