什么是跨域访问?

跨域访问指的是在浏览器中,一个网页的JavaScript代码在向不同域名或者不同端口的服务器发送HTTP请求时会受到限制。这是由于浏览器的同源策略所导致的。同源策略要求一个网站的脚本只能访问其来源相同的资源。所谓的同源是指协议、域名和端口都相同。

为什么需要跨域访问?

在现代的Web应用程序中,经常需要请求不同的域名下的数据。以常见的场景为例,假设我们的前端应用程序部署在一个域名下,而后端的API服务则在另一个域名下。如果前端直接调用API服务,由于跨域限制,浏览器会阻止这样的请求,并且抛出一个错误。所以,为了实现前端与后端之间的交互,我们需要解决跨域访问的问题。

解决跨域访问的方法

1. JSONP
JSONP是一种跨域访问的简单且常用的方法。JSONP利用了<script>标签可以加载不同域下的脚本的特性,可以通过动态创建<script>标签,并设置其src属性为API服务的地址加上回调函数名的参数。后端在接收到请求后,将数据包装在回调函数中返回,前端通过定义相应的回调函数来处理返回的数据。

示例代码:


<script>
    function handleResponse(data) {
        // 处理返回的数据
    }
</script>
<script src="http://api.example.com/data?callback=handleResponse"></script>

2. CORS(跨域资源共享)
CORS是一种更加灵活和安全的跨域访问解决方案。CORS通过在HTTP响应头中添加一些特殊的字段来实现跨域权限控制。例如,服务器可以在返回的响应头中添加"Access-Control-Allow-Origin"字段指定允许访问的域名。浏览器在收到这个响应后,会检查这个字段,并决定是否允许前端页面获取响应的内容。

示例代码:


const xhr = new XMLHttpRequest();
xhr.open('GET', 'http://api.example.com/data');
xhr.withCredentials = true;  // 允许携带凭据
xhr.onreadystatechange = () => {
    if (xhr.readyState === XMLHttpRequest.DONE) {
        if (xhr.status === 200) {
            const responseData = xhr.responseText;
            // 处理返回的数据
        } else {
            // 处理错误
        }
    }
};
xhr.send();

3. 反向代理
反向代理是一种将请求转发到目标服务器的方式。通过在同一个域名下部署反向代理服务器,前端页面在向反向代理服务器发送请求时,反向代理服务器会将请求转发到目标服务器上,并将响应返回给前端页面。由于前端页面与反向代理服务器的通信是同源的,因此可以避免跨域问题。

示例代码:


const xhr = new XMLHttpRequest();
xhr.open('GET', '/api/data');
xhr.onreadystatechange = () => {
    if (xhr.readyState === XMLHttpRequest.DONE) {
        if (xhr.status === 200) {
            const responseData = xhr.responseText;
            // 处理返回的数据
        } else {
            // 处理错误
        }
    }
};
xhr.send();

以上是三种常见的解决跨域访问的方法。根据实际情况选择合适的方法来解决跨域问题,可以使前端与后端之间的交互更加灵活和安全。