在Ubuntu环境下用JavaScript处理跨域请求,其实是个老生常谈但又不得不面对的问题。通常有几种主流方案,下面逐一拆解,你会发现有些方法虽然古老但依然有效,有些则是现代开发的首选。

CORS(跨源资源共享)
这是目前最推荐、也最灵活的做法。核心思路很简单:在服务器端设置HTTP响应头
Access-Control-Allow-Origin,明确告诉浏览器哪些外部域可以访问资源。比如你有一个Node.js服务器,用Express框架,可以这样配置:const express = require('express'); const app = express(); app.use((req, res, next) => { res.header('Access-Control-Allow-Origin', '*'); // 或者指定一个域,如 'http://example.com' res.header('Access-Control-Allow-Headers', 'Origin, X-Requested-With, Content-Type, Accept'); next(); }); app.get('/data', (req, res) => { res.json({ message: 'This is data from the server.' }); }); app.listen(3000, () => { console.log('Server running on port 3000'); });客户端这边,用原生的
fetch或XMLHttpRequest发起请求就行,几乎不需要额外处理:fetch('http://localhost:3000/data') .then(response => response.json()) .then(data => console.log(data)) .catch(error => console.error('Error:', error));JSONP(仅限GET请求)
这是一项比较“古老”的技术,但碰上某些老系统或无法修改服务器配置的场景,它依然是个保底选择。原理很简单:
标签不受同源策略限制,所以我们可以动态创建它,把请求参数拼在URL里,服务器返回一段调用指定回调函数的JavaScript代码。客户端需要提前定义好这个回调函数。服务器端示例(Node.js):
app.get('/data', (req, res) => { const callback = req.query.callback; const data = { message: 'This is data from the server.' }; res.send(`${callback}(${JSON.stringify(data)})`); });客户端代码:
function handleResponse(data) { console.log('Data received:', data); } const script = document.createElement('script'); script.src = 'http://localhost:3000/data?callback=handleResponse'; document.body.appendChild(script);注意:这种方法只支持GET请求,安全性也相对较弱,所以除非万不得已,否则尽量别用它。
代理服务器
在客户端和实际目标服务器之间架设一个同源的代理服务器,所有请求先发给代理,再由代理转发给目标服务器,接收响应后原路返回。这样浏览器端看到的是同源请求,自然没有跨域问题。
用Node.js的
http-proxy-middleware中间件可以快速实现,比如在Webpack或Vite的开发配置中经常这么干。当然,生产环境也可以部署独立的代理服务。使用第三方库或工具
有些库已经帮你处理了跨域请求的细节,比如Axios。它基于Promise,支持浏览器和Node.js,而且内部封装了自动处理跨域的逻辑(比如默认携带cookie等)。客户端代码会非常简洁:
axios.get('http://localhost:3000/data') .then(response => console.log(response.data)) .catch(error => console.error('Error:', error));不过要注意,Axios只是帮你发请求,真正的跨域解决还是要靠服务器端配合(CORS)或代理。
综合来看,如果你能控制服务器端,CORS是最干净、最安全的选择,因为它支持各种HTTP方法,并且可以精细控制允许哪些域、哪些头信息。如果服务器端改不了,那JSONP或代理服务器就是你的备选方案。在实际项目中,代理服务器也常用于开发环境调试,比如通过Webpack Dev Server的proxy配置。总之,根据你的场景灵活选用就好。