什么是跨域资源访问

本系列文章的思想,都融入了 让 Java 再次伟大 这个全新设计的脚手架产品中,欢迎大家使用。

什么是跨域资源访问

当一个资源请求一个其它域名或者另外一个端口的资源时会产生一个跨域 HTTP 请求(cross-origin HTTP request)。比如说,http://domaina.example 的某 HTML 页面通过 img 的 src 请求 http://domainb.foo/image.jpg

在当今的Web 开发中,许多页面都会从另外一个站点加载各类资源(包括 CSS、图片、JavaScript 脚本以及其它类资源)。而针对这些同来源的各类资源的交互,各大浏览器往往遵循「同源策略」对交互进行处理。

什么是同源访问策略

同源策略限制从一个源加载的文档或脚本如何与来自另一个源的资源进行交互。如果协议、端口(如果指定了一个)和主机对于两个页面是相同的,则两个页面具有相同的源。
下表给出了相对 http://store.company.com/dir/page.html 同源检测的示例:

URL结果原因
http://store.company.com/dir2/other.html成功dir2/other.html
http://store.company.com/dir/inner/another.html成功dir/inner/another.html
https://store.company.com/secure.html失败不同的协议 ( https )
http://store.company.com:81/dir/etc.html失败不同的端口 ( 81 )
http://news.company.com/dir/other.html失败不同的主机(主机)

同源策略的交互定义

同源策略控制了不同源之间的交互,例如在使用 XMLHttpRequest 或 img 标签时则会受到同源策略的约束。交互通常分为三类:

  • 通常允许进行跨域写操作(Cross-origin writes)。例如链接(links),重定向以及表单提交已经发送 ajax 请求。(特定少数的 HTTP 请求需要添加 preflight)
  • 通常允许跨域资源嵌入(Cross-origin embedding)。之后下面会举例说明。
  • 通常不允许跨域读操作(Cross-origin reads)。但常可以通过内嵌资源来巧妙的进行读取访问。例如可以读取嵌入图片的高度和宽度,调用内嵌脚本的方法。

常见跨域资源嵌入示例

  • <script src="..."></script>标签嵌入跨域脚本。语法错误信息只能在同源脚本中捕捉到。
  • <img>嵌入图片。支持的图片格式包括 PNG,JPEG,GIF,BMP,SVG,…
  • <video><audio>嵌入多媒体资源。

可见,在通常情况下使用 XMLHttpRequest 的跨域读取操作将会受到限制,而<img>的资源嵌入操作则可以执行。不过,若当前环境希望用户能够自由请求服务器,不受同源策略限制应该怎么办?这样的问题,就需要引入 CORS。

什么是 CORS

CORS 是一种跨域资源共享(Cross-origin resource sharing)的解决方案。它定义了一种浏览器和服务器交互的方式来确定是否允许跨域请求。这比起简单地允许所有这些的要求来说更加安全。

简言之,CORS 就是为了让 AJAX 可以实现可控的跨域访问而生的。通常我们采用配置 http response header 的方式就可以启用 CROS Access–Control-Allow-Origin: *

这也就是说 CORS 的配置一定是定义在服务器的——即只有服务器自己能决定来自其他源 (origin) 的请求是否有资格从我这里获取信息。

启用 CORS 带来的安全隐患

  1. 即便服务器只允许来自某个信任网站的请求,但是它也会收到大量来自其他域的跨域请求。这些请求有时可能会被用于执行应用层面的 DDOS 攻击。
  2. 假定一个服务器开启了 CORS,如果内部网络的用户访问了恶意网站,恶意网站可以通过 CORS(跨域请求)来获取到内部站点的内容。

总结

属于不同源的资源之间互相请求时会产生「跨域访问」的问题。各大浏览器通常基于「同源策略」对跨域访问进行处理。而 CORS 则提供了跨域资源共享的解决方案,使的同源策略能够通过 CORS 变得更加的灵活,以满足不同场景的需要。

### 跨域的定义 跨域是指当一个网页通过 JavaScript 或其他前端技术尝试访问另一个域名下的资源时,如果该资源所在的服务器不允许被外部访问,则会产生同源策略限制的现象。这种现象源于浏览器的安全机制——即只有在同一协议、同一主机名和同一端口号的情况下,才能互相访问资源[^1]。 为了应对这一问题,开发者引入了多种技术和方法来实现合法的跨域通信,其中包括 JSONP 请求、CORS 配置以及 WebSocket 技术等。 --- ### 跨域在 Web 开发中的影响 #### 1. **安全性** 跨域的存在主要是出于安全考虑。如果没有跨域限制,恶意网站可能会利用用户的登录状态窃取敏感信息或执行未经授权的操作。因此,在实际开发中,合理配置 CORS 是保障数据传输安全的重要手段之一[^3]。 #### 2. **功能受限** 由于默认情况下无法直接跨越不同的源获取数据,这给一些需要调用第三方 API 的场景带来了挑战。例如电商平台可能希望展示来自多个供应商的商品列表,而这些商品的信息存储于各自的独立服务之中。此时如果不妥善处理好跨域设置,就可能导致页面加载失败或者显示不全的情况发生[^1]。 #### 3. **用户体验优化** 解决跨域问题是改善用户体验的关键环节之一。比如采用 Service Worker 结合 `mode: 'no-cors'` 可以绕过某些严格的跨域检查规则从而加快静态文件下载速度;又或者是借助 WebSocket 实现低延迟双向通讯以便实时更新界面内容等等[^4]。 以下是基于上述提到的技术的一个简单示例: ```javascript // 利用WebSocket建立持久化连接 const socket = new WebSocket("wss://example.com/socket"); socket.onopen = () => { console.log("Connection opened"); }; socket.onerror = (error) => { console.error("Error:", error); }; socket.onmessage = (event) => { const message = event.data; console.log(`Received from server: ${message}`); }; ``` 此代码片段展示了如何创建并维护一条稳定的 WebSocket 连接通道用于持续交换消息。 --- ### 浏览器兼容性注意事项 值得注意的是,尽管现代主流浏览器普遍支持 CORS 和 WebSocket 功能,但对于老旧版本仍需特别留意它们的具体行为差异。像 Internet Explorer 就是在第10版才完全遵循标准实现了跨资源共享特性,而在更早期则依赖特殊的 XDomainRequest 对象作为替代方案[^2]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值