📅  最后修改于: 2023-12-03 14:57:22.455000             🧑  作者: Mango
CORS,即跨源资源共享,是一种将跨域请求的数据共享到其他来源的技术。然而,有些请求被浏览器的同源策略禁止,这就是角CORS问题。
角CORS问题指的是,在角(或相同的域)命名空间下,发送跨源请求时受到了同源策略的限制。
这是因为浏览器默认情况下只允许客户端从同一来源(协议,域名和端口)发出请求。这意味着,如果我们尝试从与应用程序不同的 URL 访问 API 或其他资源,就会遇到CORS问题。
有几种方法可以解决CORS问题:
使用代理服务可以绕过CORS限制,将请求从前端发送到后端,然后在后端进行请求。这种方法需要一个中间服务器,将前端(Angular,React等)和 API服务器(node.js,.NET等)之间包装起来。
const express = require('express');
const request = require('request');
const app = express();
app.use(express.json());
app.use('/', (req, res) => {
const url = 'https://api.somesite.com' + req.url;
req.pipe(request(url)).pipe(res);
});
app.listen(3000, () => {
console.log('Server started...');
});
JSONP是由Script标签引入的JavaScript代码,允许一个页面从不同的源获取并处理数据。虽然不是正式的XHR请求,但它在早期的Web应用程序中得到了广泛使用。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8" />
<title>JSONP Example</title>
</head>
<body>
<div id="result"></div>
<script>
function callback(response) {
document.getElementById('result').innerHTML = response.data;
}
const script = document.createElement('script');
script.src = 'https://api.somesite.com/data?callback=callback';
document.getElementsByTagName('head')[0].appendChild(script);
</script>
</body>
</html>
在服务器端启用CORS是一个有效的解决方案,在服务器端解决CORS问题可以确保所有客户端都从相同的支持请求中受益,而不单个客户端。CORS通过向响应标头添加特定的标头来启用,指示浏览器允许来自不同源的请求。
const express = require('express');
const app = express();
app.use(express.json());
app.use('/', (req, res, next) => {
res.header('Access-Control-Allow-Origin', '*');
res.header(
'Access-Control-Allow-Methods',
'GET, POST, PUT, DELETE, PATCH, OPTIONS',
);
res.header(
'Access-Control-Allow-Headers',
'Origin, X-Requested-With, Content-Type, Accept',
);
next();
});
// REST API
app.get('/api/data', (req, res) => {
// handle request here...
res.json({ data: 'some data' });
});
app.listen(3000, () => {
console.log('Server started...');
});
以上三种方法都可以解决角CORS问题。使用代理和启用CORS是最常用的方法。 JSONP在某些情况下仍然很有用。但是,需要特别小心,因为JSONP的安全性受到限制,容易受到JSON注入攻击的威胁。