在浏览器中,一个Web页面从一个服务器的域名、端口或协议请求资源时,如果该请求目标与该Web页面的域名、端口或协议不一致,就会发生跨域。
JS跨域总结攻略
什么是跨域
在浏览器中,一个Web页面从一个服务器的域名、端口或协议请求资源时,如果该请求目标与该Web页面的域名、端口或协议不一致,就会发生跨域。
JS跨域的原因
跨域问题的出现是因为浏览器的同源策略。同源策略是浏览器对JavaScript代码的安全限制,同源是指协议,域名,端口号均相同。浏览器阻止页面中的JavaScript程序去访问不同源下的资源,以此保障用户的信息安全。
JS跨域的解决方案
- JSONP
JSONP(JSON with Padding)是一种解决跨域的方案,它的原理是利用script标签不受同源策略限制的特性,在请求时通过动态创建script标签,将需要获取的数据作为回调函数的参数传递到前端页面中。
示例:
前端页面代码:
function handleResponse(data) {
console.log(data);
}
const script = document.createElement("script");
script.src = "http://domain1.com/api?callback=handleResponse";
document.body.appendChild(script);
后台接口代码:
const query = req.query;
const str = JSON.stringify(req.query);
const callback = query.callback;
res.send(`${callback}(${str})`);
- CORS
CORS(Cross-Origin Resource Sharing)是由W3C提出的一种跨域解决方案,其原理是在服务端设置Access-Control-Allow-Origin头信息来告诉浏览器请求的域可以跨域请求数据。
示例:
前端页面代码:
fetch("http://domain2.com/api", {
method: "GET",
mode: "cors",
headers: {
"Content-Type": "application/json",
},
}).then((res) => console.log(res));
后台接口代码:
res.set("Access-Control-Allow-Origin", "http://domain1.com");
res.set("Access-Control-Allow-Methods", "GET, POST");
res.set("Access-Control-Allow-Headers", "Content-Type");
res.send("Hello CORS");
其他跨域解决方案
- 代理服务器
可以在本地创建一个代理服务器,用这个服务器向目标服务器发起请求,然后再将结果返回给浏览器,绕过同源策略的限制。但是这种方案需要依赖于一个可靠的代理服务器。
- WebSocket
WebSocket是一种双向通信协议,没有同源策略限制,可以用来在不同源的浏览器客户端之间打通通讯线路。但是该协议需要在服务端和客户端同时支持,需要较高的技术实力才能实现。
总结
对于跨域问题,我们可以通过JSONP和CORS两种方案来解决。JSONP适用于简单的跨域场景,而CORS则适用于复杂的跨域场景。除了这两种方案,我们还可以通过代理服务器和WebSocket等技术来解决跨域问题。
本文标题为:JS跨域总结
- css中子元素设置margin-top为什么影响了父元素 2023-12-13
- Ajax同步和异步问题浅析及解决方法 2023-01-31
- 详解JS中continue关键字和break关键字的区别 2022-08-31
- jQuery AJAX中readyState与status的区别与联系 2023-01-31
- Vue3.2中setup语法糖的使用教程分享 2023-07-10
- 怎么把网站的图片以WebP格式展示 2022-09-08
- CSS极坐标的实例代码 2022-09-20
- 纯 CSS 自定义多行省略的问题(从原理到实现) 2023-12-13
- html中两种获取标签内的值的方法 2022-09-21
- pdfjs预览 vue中常见的坑及修改预览的标题名 2023-10-08