cors解决跨域的几点认识

1,361 阅读1分钟

1.跨域产生的原因:浏览器为了安全,遵循“同源策略”

2.cors比jsonp要强大,jsonp只支持get请求,cors支持所有http请求类型

3.cors的实现,需要浏览器和服务器同时支持,主要是服务器支持。

ps:目前,所有浏览器都支持该功能,IE浏览器不能低于IE10。它允许浏览器向跨源服务器,发出XMLHttpRequest请求,从而克服了AJAX只能同源使用的限制。整个CORS通信过程,都是浏览器自动完成,不需要用户参与。对于开发者来说,CORS通信与同源的AJAX通信没有差别,代码完全一样。浏览器一旦发现AJAX请求跨源,就会自动添加一些附加的头信息,有时还会多出一次附加的请求,但用户不会有感觉。因此,实现CORS通信的关键是服务器。只要服务器实现了CORS接口,就可以跨源通信。

4.跨域如何携带cookie,

服务端设置 Access-Control-Allow-Credentials: true,响应头会使浏览器允许在 Ajax 访问时携带 Cookie

客户端设置withCredentials:true 参数,实现携带 Cookie 的目标

5.jquery ajax实现cors携带cookie的写法

$.ajax({
    type: 'get',
    url: domain + '/api_m/api/user/favorite/get/status',
    data: {
        objId: this.data.objId,
        objType: this.data.objType,
        authorization: this.authorization
    },
    crossDomain: true, //设置跨域为true
    xhrFields: {
        withCredentials: true //默认情况下,标准的跨域请求是不会发送cookie的
    },
    success: function (result) {
       
    },
    error: function () {
        
    }
});

6.axios实现cors携带cookie

axios.defaults.baseURL = process.env.VUE_APP_M_URL;
axios.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded';
axios.defaults.crossDomain = true;
axios.defaults.transformRequest = data => qs.stringify(data, { allowDots: true });
axios({
  method: method.toLowerCase(),
  url,
  [modeKey]: obj || {},
  withCredentials: true
})
.then((response) => {
  resolve(response.data, url);
})
.catch((error) => {
  reject(error);
});

参考:developer.mozilla.org/zh-CN/docs/…