面试热题之跨域问题及解决方案(一)

86 阅读2分钟

在现代Web开发中,跨域资源共享(CORS, Cross-Origin Resource Sharing) 是一个常见的挑战。无论是前端框架如React或Vue,还是后端技术栈如Node.js,甚至是移动端应用开发,理解如何正确处理跨域请求对于实现前后端分离架构至关重要。

一.什么是跨域?

跨域指的是浏览器的一个安全机制,它限制了一个源(协议+域名+端口号)的文档或脚本试图请求另一个源下的资源。如果两个URL的协议、域名或端口不同,则它们被视为不同的源。当协议/域名/端口 其中任意一个与当前页面不同则视为跨域请求。

  • http://localhost:5173 尝试访问 http://localhost:8080/api/text 是跨域。
  • 同样,https://example.com 访问 http://example.com/api/user 也是跨域,因为协议不同。

跨域的原因

这种限制是为了保护用户的安全,防止恶意网站读取其他网站的数据,即所谓的同源策略(Same-Origin Policy)

二、为什么学习跨域?

随着前后端分离成为主流开发模式,前端和后端通常运行在不同的端口甚至不同的服务器上,这就不可避免地会遇到跨域的问题。了解并掌握解决跨域的方法是每个Web开发者必须具备的基本技能之一。

三、跨域请求被阻止的情况

当一个跨域请求发生时,浏览器首先发送一个预检请求(OPTIONS),以确定实际请求是否安全。如果服务器没有正确配置CORS响应头,浏览器将会阻止该请求,并且不会将响应内容暴露给前端代码。

四、如何解决跨域?

1. CORS 头部配置

最直接的方法是在服务器端设置适当的CORS头部信息。例如,在Express应用中可以通过中间件来允许特定来源的请求:

app.use((req, res, next) => {
    res.header('Access-Control-Allow-Origin', '*'); // 允许所有来源
    res.header('Access-Control-Allow-Headers', 'Origin, X-Requested-With, Content-Type, Accept');
    next();
});

2. JSONP (JSON with Padding)

JSONP是一种通过<script>标签绕过同源策略的技术,主要用于GET请求。其工作原理是让服务器返回一段可执行的JavaScript代码,这段代码调用一个由前端定义好的回调函数,并将数据作为参数传递进去。

然而,由于其安全性问题(比如容易受到XSS攻击),并且仅支持GET请求,现在已较少使用。

示例:

前端代码:

<script>
function handleResponse(data) {
    console.log(data);
}
</script>
<script src="http://example.com/data?callback=handleResponse"></script>

后端代码(假设为Node.js):

app.get('/data', (req, res) => {
    const callback = req.query.callback;
    const data = { message: "Hello World" };
    res.send(`${callback}(${JSON.stringify(data)})`);
});

结论

跨域问题是Web开发中的一个重要概念,理解和掌握如何有效解决跨域问题对于构建高效、安全的Web应用至关重要。根据具体的应用场景选择合适的解决方案,可以确保既能满足业务需求,又能保障系统的安全性。无论你是前端开发者还是全栈工程师,深入理解跨域机制都将有助于提升你的技术水平。