CORS缺失Access-Control-Allow-Origin:为何LeetCode页面可调用API我却报错?
先搞懂CORS的核心逻辑
你觉得困惑很正常,核心要明白:浏览器的CORS限制不是阻止跨域请求发送,而是阻止非同源的前端代码读取响应内容。
LeetCode自己的页面和API同属leetcode.com域名,属于同源,所以浏览器允许页面里的JS读取API响应;而你的代码如果是在非leetcode.com的环境(比如普通网页、未配置权限的扩展脚本)发起请求,浏览器会拦截响应,不让你的JS拿到数据——这就是你看到Access-Control-Allow-Origin缺失错误的原因。
CORS的作用是保护用户数据:假设你登录了LeetCode,浏览器保存了你的登录Cookie。如果没有CORS限制,恶意网站的JS代码可以偷偷发起LeetCode API请求(自动带上你的Cookie),然后读取响应拿到你的个人信息、做题记录等敏感数据。有了CORS,恶意网站的JS根本读不到响应内容,就算请求发出去了,也拿不到有用的数据,从而避免了数据泄露。
Firefox扩展的合法解决方法
不用依赖CORS Everywhere这类工具,Firefox扩展本身就有跨域请求的特权,只需在扩展的manifest.json里配置对应权限即可:
- 在
manifest.json中添加LeetCode域名的权限:
{ "manifest_version": 3, // 可根据你的扩展版本调整为v2 "permissions": ["https://leetcode.com/*"], // 其他扩展配置项... }
- 在扩展的背景脚本或者内容脚本中发起请求:
- 背景脚本完全不受网页同源限制,直接用
fetch就能正常获取响应; - 如果是内容脚本,只要扩展已经申请了
https://leetcode.com/*权限,也能直接发起请求,或者通过browser.runtime.sendMessage把请求任务交给背景脚本处理,再接收返回的数据。
- 背景脚本完全不受网页同源限制,直接用
比如你的代码放在背景脚本里,直接运行就不会有CORS问题,和用CORS Everywhere的效果一样,但这是浏览器官方允许的合法方式。
关于“绕过”的说明
对于普通网页来说,没有合法的非服务端绕过CORS的方法——所有所谓的“绕过”要么依赖第三方工具,要么是利用浏览器漏洞,随时可能失效。但对于Firefox扩展,我们不需要“绕过”,直接用扩展的权限机制就能解决问题,这才是正确的路径。
内容的提问来源于stack exchange,提问作者burningpocket

