跨域(CORS, Cross-Origin Resource Sharing)是前端开发中常见的安全限制问题,当请求的协议、域名或端口不同时,浏览器会阻止这种跨域请求。以下是常见的解决方案:
// Node.js Express示例
app.use((req, res, next) => {
res.header("Access-Control-Allow-Origin", "*"); // 或指定特定域名
res.header("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE");
res.header("Access-Control-Allow-Headers", "Content-Type, Authorization");
next();
});
location /api/ {
proxy_pass http://backend-server/;
add_header 'Access-Control-Allow-Origin' '*';
add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';
}
function jsonp(url, callbackName, callback) {
const script = document.createElement('script');
script.src = `${url}?callback=${callbackName}`;
window[callbackName] = callback;
document.body.appendChild(script);
}
// webpack.config.js
module.exports = {
devServer: {
proxy: {
'/api': {
target: 'http://target-server.com',
changeOrigin: true,
pathRewrite: {'^/api': ''}
}
}
}
}
WebSocket协议不受同源策略限制
// 发送方
window.postMessage('message', 'https://target-domain.com');
// 接收方
window.addEventListener('message', event => {
if (event.origin !== 'https://source-domain.com') return;
console.log(event.data);
});
Access-Control-Allow-Credentials
和withCredentials
选择哪种方案取决于您的具体应用场景、安全需求和基础设施配置。