跨域问题(CORS)

介绍

跨域资源共享(CORS, Cross-Origin Resource Sharing)是浏览器的一个安全机制,用来防止来自一个域的网页对另一个域下的资源进行请求。仅允许向 同域名同端口 的服务器发送请求。
对于前后端分离的项目,往往会有跨域问题。

解决

一、添加跨域头,允许跨域

1.后端配置CORS策略(4种方法)

浏览器检测到跨域请求时,会先发送一个预检请求(OPTIONS)给后端服务器,若后端配置了CORS策略,即返回允许的 CORS 头(如 Access-Control-Allow-Origin)来告诉浏览器它允许跨域请求。如果服务器未返回这些头,浏览器将阻止实际请求。如果预检请求成功,浏览器将继续发送实际的请求。如果服务器的响应中没有正确的 CORS 头,浏览器同样会阻止实际请求的返回数据。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2.配置nginx

#跨域配置
location /api {
    add_header 'Access-Control-Allow-Origin' $http_origin;
    add_header 'Access-Control-Allow-Credentials' 'true';
    add_header Access-Control-Allow-Methods 'GET, POST, OPTIONS';
    add_header Access-Control-Allow-Headers '*';
    if ($request_method = 'OPTIONS') {
        add_header 'Access-Control-Allow-Credentials' 'true';
        add_header 'Access-Control-Allow-Origin' $http_origin;
        add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';
        add_header 'Access-Control-Allow-Headers' 'DNT,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range';
        add_header 'Access-Control-Max-Age' 1728000;
        add_header 'Content-Type' 'text/plain; charset=utf-8';
        add_header 'Content-Length' 0;
        return 204;
    }
}

二、代理

代理的原理是,由于CORS检测只会在客户端进行,只需要前端的请求也是同域名同端口即可,前端发送请求到代理服务器,这个代理服务器和前端服务器的域名和端口一致,不会触发CORS,然后代理服务器再将请求转发给后端服务器即可。

开发环境: 前端使用代理,简化开发过程中的跨域问题。
代理的实质是转发请求,前端请求到代理时浏览器会认为是同源,不会触发跨域限制,之后代理服务器再将请求转发给后端服务器。
比如proxy.ts文件里的
在这里插入图片描述

生产环境:
可使用Nginx或其他反向代理服务器

location /api {
    proxy_pass http://127.0.0.1:8080;
}
要解决跨域问题,需要在服务器端设置响应头信息,告诉浏览器该请求允许跨域访问。具体步骤如下: 1. 在服务器端设置响应头信息。 在服务器端的响应头信息中添加Access-Control-Allow-Origin字段,指定允许跨域访问的源地址。 例如,在Node.js中可以使用以下代码: ``` res.setHeader('Access-Control-Allow-Origin', '*'); ``` 这里的*表示允许所有来源进行跨域请求,也可以指定具体的源地址。 2. 设置响应头信息中的其他字段。 除了Access-Control-Allow-Origin字段,还需要设置其他字段,例如Access-Control-Allow-Methods、Access-Control-Allow-Headers等。这些字段的作用是告诉浏览器该请求允许的方法、头信息等。 例如,在Node.js中可以使用以下代码: ``` res.setHeader('Access-Control-Allow-Methods', 'POST, GET, OPTIONS'); res.setHeader('Access-Control-Allow-Headers', 'Content-Type'); ``` 这里的Access-Control-Allow-Methods字段表示允许POST、GET、OPTIONS方法的请求,Access-Control-Allow-Headers字段表示允许Content-Type头信息的请求。 3. 处理OPTIONS请求。 在跨域请求中,浏览器会先发送一个OPTIONS请求,用于询问服务器是否允许实际请求。因此,需要在服务器端处理该请求,返回响应头信息中的字段。 例如,在Node.js中可以使用以下代码: ``` if (req.method === 'OPTIONS') { res.writeHead(200, { 'Access-Control-Allow-Origin': '*', 'Access-Control-Allow-Methods': 'POST, GET, OPTIONS', 'Access-Control-Allow-Headers': 'Content-Type' }); res.end(); } ``` 这里的req.method表示请求的方法,如果是OPTIONS请求,就返回响应头信息中的字段。 以上就是实现简单的跨域问题cors的步骤,需要注意的是,不同的服务器端语言和框架实现方式可能有所不同。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值