如何解决跨域问题

Posted yihengbaobei

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何解决跨域问题相关的知识,希望对你有一定的参考价值。

(1)考察目标

1)跨域出现的原因

2)解决的跨域的方式有哪些。

(2)题目分析

1)跨域出现的原因:同源策略。

什么是同源策略:同源策略(Sameoriginpolicy)是一种约定,它是浏览器最核心也最基本的安全功能,如果缺少了同源策略,则浏览器的正常功能可能都会受到影响。可以说Web是构建在同源策略基础之上的,浏览器只是针对同源策略的一种实现。同源策略会阻止一个域的javascript脚本和另外一个域的内容进行交互,同源三要素:协议、端口、域名。当一个请求url的协议、域名、端口**三者之间任意一个与当前页面url不同即为跨域。请求就不被允许。

2)解决的跨域的方式有哪些

反向代理跨域

CORS跨域

CORS 是跨域资源分享(Cross-Origin Resource Sharing)的缩写。

它是 W3C 标准,属于跨源 AJAX 请求的根本解决方法。

普通跨域请求:只需服务器端设置Access-Control-Allow-Origin

带cookie跨域请求:前后端都需要进行设置

前端设置:

// 前端设置:根据xhr.withCredentials字段判断是否带有cookie

// 原生ajax

var xhr = new XMLHttpRequest()

xhr.withCredentials=true

xhr.open(‘post‘,‘http://www.domain2.com:8080/login‘,true)

xhr.setRequestHeader(‘Content-Type‘,‘application/x-www-form-urlencoded‘)

xhr.send(‘user-admin‘)

xhr.onreadystatechange = function(){

  if(xhr.readyState===4&&xhr.status==200){}

}



// jQuery的ajax

$.ajax({

  url:‘http://www.text.com:8080/login‘,

  type:‘get‘,

  data:{},

  xhrfields:{withCredentials:true},

  crossDomain:true// 会让请求头中包含跨域的额外信息,但不包含cookie

})



// axios

axios.defaults.withCredentials=true

服务端设置(node):

// node服务端设置

res.writeHead(200,{

  // 后端允许发送cookie

  ‘Access-Control-Allow-Credentials‘:‘true‘,

  // 设置允许访问的域

  ‘Access-Control-Allow-Origin‘:‘http://www.domain1.com‘,

  ‘Set-Cookies‘:‘l=a123456;Path=/;Domain=www.domain2.com;HttpOnly‘,



})

3)jsonp跨域

JSONP是服务器与客户端跨源通信的方法之一,最大特点就是简单,缺点是只支持get请求

核心思想:网页通过添加一个script元素,向服务器请求JSON数据,服务器将数据放在一个指定名字的回调函数的参数位置传回来

(3)应用场景

一般在vue项目中最主要的方式就是使用devServer的反向代理。

当使用多个地址也可以通过后台cors配置跨域。

另外也可以通过nginx进行代理。

视频地址:

https://p.bokecc.com/qrplay.bo?uid=78665FEF083498AB&vid=C6332E4A7DA07F4E9C33DC5901307461

以上是关于如何解决跨域问题的主要内容,如果未能解决你的问题,请参考以下文章

如何解决ajax跨域问题(转)

如何解决ajax跨域问题(转)

如何解决ajax跨域问题(转)

如何解决IE8下Ajax调用时跨域的问题

跨域请求如何携带cookie?不小心都拿了Offer

前后端分离实践 — 如何解决跨域问题