如何处理浏览器的跨域问题
2020-04-07 本文已影响0人
sorry510
第一种方式 CORS
首先你需要阅读CORS,
首先你需要阅读CORS,
首先你需要阅读CORS,重要的事情说3遍
当浏览器发送一个跨域的xhr时,需要注意的是,首先会发送一个Request Method: OPTIONS
类型的请求,如下图
此时后台需要处理的是,发送一些
header
,通知浏览器协商的内容,可以进行跨域访问,已php
为例,写法如下
header('Access-Control-Allow-Origin:*'); // 可以进行的跨域ip或域名,*代表所有
header('Access-Control-Allow-Methods:OPTIONS, GET, POST'); // 允许跨域的请求方式,options,get,post请求
header('Access-Control-Allow-Headers:X-Requested-With,key,token'); // 允许通过的自定义hearder字段,可以写多个
!!!特别需要注意的有2点!!!
-
OPTIONS
的请求并不会携带任何额外的数据
,它只是一次预处理,在此次请求中不能接收get
,post
,header
等数据,所以你需要做的只是设置header
,然后直接返回(不要再让程序走向具体的代码逻辑了,你接受不到其它数据的,你应该使用一个基类来统一处理跨域)http的200成功状态码,如果你的后端程序返回了500
等其他状态码,会导致真正的请求(get或post)不会再进行下去. - 如果使用的是
cookie
和session
模式,cookie
一般是不会自动携带的,客户端需要设置Access-Control-Allow-Credentials
: true
,但此时又会出现另外一个问题,后端此时的Access-Control-Allow-Origin:*
不可以设置为*
,这是不被允许的,因为不安全。但你可以使用一个技巧来回避这个问题,'Access-Control-Allow-Origin:动态获取到的客户端ip'
第二种方式,前端proxy代理,只适用于项目开发
当你使用了前端的vue,react,angular等框架时,可以直接使用他们的脚手架,脚手架提供一个配置好的webpack
,可以在配置文件中的proxy添加代理地址,这样可以避免跨域问题,如果是自己搭建的框架自行配置webpack
依然可以实现代理
第三种方式,后端代理,可以用于项目部署
后台的静态服务器(apache,nginx)一般都带有代理功能,可以自行配置,代理前端项目的xhr请求到真实的后台接口地址,这样可以避免跨域问题