跨域问题指的是在浏览器端,当一个页面的脚本试图去访问另一个页面的资源时,如果这两个页面的协议、域名或端口不同,则会产生跨域问题。
浏览器出于安全考虑,会使用同源策略限制一个页面中的脚本只能访问同域下的资源,以防止恶意脚本利用跨域漏洞窃取用户隐私信息。
以下是常用的几种解决跨域问题的方式:
JSONP(JSON with Padding)是一种跨域通信的方式,它通过动态创建 <script>
元素,向服务器请求数据,服务器将数据以函数调用的形式返回,从而实现跨域通信。
<script>
function handleResponse(data) {
console.log(data);
}
var script = document.createElement('script');
script.src = 'http://example.com/data?callback=handleResponse';
document.body.appendChild(script);
</script>
CORS(Cross-Origin Resource Sharing)是一种跨域资源共享的机制,它需要服务器设置响应头 Access-Control-Allow-Origin
允许指定域下的客户端访问。
Access-Control-Allow-Origin: http://example.com
通过在同域下部署一个代理服务器,在代理服务器上请求跨域资源,再将结果返回给客户端,从而避免了跨域问题。
// 客户端代码
fetch('/proxy?url=http://example.com/data')
.then(response => response.json())
.then(data => console.log(data));
// 代理服务器代码
const http = require('http');
const httpProxy = require('http-proxy');
const proxy = httpProxy.createProxyServer({});
const server = http.createServer((req, res) => {
if (req.url.startsWith('/proxy')) {
proxy.web(req, res, {
target: req.url.slice('/proxy?url='.length)
});
} else {
res.writeHead(404);
res.end();
}
});
server.listen(80);