文章
关于tauri中前端代码引用图片跨域请求限制的问题
目录
为什么会出现跨域请求限制?#
🧠 浏览器的跨域限制只作用于前端代码发起的请求#
浏览器的 同源策略 (Same-Origin Policy) 是为了安全,阻止前端 JS 直接访问不同源的资源(除非服务端支持 CORS)。此处以图片为例,通常我们在前端中是这样引入图片的:<img src={src} alt={alt} className={className} />,这里我想引用哔哩哔哩的视频封面图片
由于哔哩哔哩的“strict-origin-when-cross-origin”我们是获取不到这个图片的。
我们是怎么解决的这个问题的?#
✅ 我们并没有直接从前端访问图片:#
而是这样做的:
前端 React ⟶ 调用 Tauri 命令(Rust 代码)⟶ Rust 用 reqwest 请求 bilibili 图片 ⟶ 返回 base64 编码给前端
这个过程中:
- 是 Rust 后端(Tauri 中的命令)通过
reqwest发起的 HTTP 请求,不受浏览器跨域策略限制。 - 最终给前端的是一个 base64 编码后的字符串,它已经不是跨域资源,而是纯文本数据,前端
img.src = "data:image/jpeg;base64,...是合法的。
🧠 base64 data URL 不再需要额外请求#
<img src="data:image/png;base64,...">是浏览器标准支持的语法。- 它是嵌入式图片数据,浏览器渲染时不会再发起 HTTP 请求。
- 这意味着:不会触发任何 CORS 校验或 OPTIONS 预检请求,更无跨域问题。
✅ 总结:#
| 方式 | 是否跨域受限 | 是否可访问 | 原因 |
|---|---|---|---|
| React 前端直接访问 bilibili 图片 | ✅ 是 | ❌ 受限于 CORS 同源策略 | 没有 CORS 头时会被浏览器阻止 |
| Tauri 后端使用 reqwest 拉取图片 | ❌ 否 | ✅ 可以自由访问任意网络资源 | 后端程序不受 CORS 限制 |
| 转为 base64 后传给前端 | ❌ 否 | ✅ 前端直接渲染 | base64 是纯数据,非跨域资源 |
🛡️ 延伸建议#
如果你未来要加载大量图片,base64 虽然规避了跨域,但会:
- 增加内存占用
- 加大传输数据量(base64 通常比原图大 33%)
- 不适合缓存(每次都要传完整) 因此,如果你有大量或高清图建议:
- 本地缓存或下载图片资源
- 或在 Rust 中转为临时文件,再通过
asset:伺服给前端