惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

F
Fortinet All Blogs
Last Week in AI
Last Week in AI
IT之家
IT之家
A
About on SuperTechFans
M
MIT News - Artificial intelligence
Y
Y Combinator Blog
T
The Blog of Author Tim Ferriss
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
博客园 - 三生石上(FineUI控件)
博客园 - 【当耐特】
V
Visual Studio Blog
Microsoft Security Blog
Microsoft Security Blog
博客园_首页
aimingoo的专栏
aimingoo的专栏
The Cloudflare Blog
Vercel News
Vercel News
博客园 - Franky
有赞技术团队
有赞技术团队
B
Blog
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
GbyAI
GbyAI
量子位
云风的 BLOG
云风的 BLOG
T
Tailwind CSS Blog

博客园 - 前端架构师

DSH 插件第二弹生态全景:11 个插件,把 DeepSeek 变成一个完整的 Coding Agent 平台 DSH 插件推荐清单:DeepSeek Harness 必装的 14 个插件 手摸手教你做一个codex桌面宠物 告别信息碎片化!我把 Claude Code、Cursor、MCP 和 Vibe Coding 整理成了一座全能 AI 宝库(建议收藏) Claude Code 源码架构分析 我不是狐狸,我是那Harness Engineering 小龙虾的自我养成之路 vue3+ts添加公共富文本组件 vue watch详解 微信授权没搞过? css3图片防止变形 公众号使用微信sdk的正确姿势 web离线应用前提之离线检测 es6手写一个call 同学给我来个手写的new吧 this综合篇 this绑定番外篇之箭头函数绑定 vue中引入公用过滤器? this详解下 012天this详解上 010天JSON.stringify()详解 009天之跨浏览器的事件处理程序 使用XHR上传文件要不要了解一下?
011天之跨域资源共享CORS
前端架构师 · 2020-03-22 · via 博客园 - 前端架构师

通过XHR实现Ajax通信的一个主要限制,来源于跨域安全策略,默认情况下XHR对象只能访问与包含它的页面位于同一个域中的资源。这种安全策略可以预防某些恶意行为。但是,实现合理的跨域请求对于开发某些浏览器的应用也是非常important的。

CORS(Cross-Origin Resource Sharing,跨域资源共享)是w3c的一个工作草案,定义了在必须访问跨域资源时,浏览器和服务器应该如何沟通。CORS背后的基本思想,就是使用自定义的HTTP头部让浏览器和服务器进行沟通,从而决定请求或响应的成功,失败。

比如一个简单的使用GET或POST发送的请求,它没有自定义的头部,而主体内容是text/plain。在发送该请求时,需要给它附加一个额外的Origin头部,其中包含请求页面的源信息(协议,域名和端口),以便服务器根据这个头部信息来决定是否给予响应。

Origin头部一个例子:

Origin :http://www.yk.com

如果服务器认为这个请求可以接受,就在Access-Control-Allow-Origin头部中回发相同的源信息例如:

Access-Control-Allow-Origin:http://www.yk.com

如果没有这个头部,或者有这个头部但源信息不匹配,浏览器就会驳回请求。

那么有没有兼容所有浏览器的CORS呢?

来喽来喽

function createCORSRequest(method, url) {
    let xhr = new XMLHttpRequest();
    if("withCredentials" in xhr) {
        xhr.open(method,url,true)
    } else if(typeof XDomainRequest != 'undefined') {
        xhr = new XDomainRequest();
        xhr.open(method, url)
    } else {
        xhr = null;
    }
    return xhr;
}
let request = createCORSRequest('get',"http://www.somewhere-else.com/page/");

if(request) {
    request.onload = function() {
        //对request.responseText进行处理
    };
    request.send();
}

createCORSRequest()函数返回的的对象中返回的属性和方法如下:

abort(): 用于停止正在进行的请求。 onerror:用于替代onreadystatechange检测错误。 onload:用于替代onreadystatechange检测成功。 responseText:用于取得响应内容。 send():用于发送请求。

扫码加群,每日更新一篇前端技术文章一起成长。