美文网首页让前端飞技术干货程序员
前端跨域常见问题以及解决方案

前端跨域常见问题以及解决方案

作者: 前端_周瑾 | 来源:发表于2018-06-18 21:12 被阅读17次
    首先,我们来先了解一下什么是跨域:

    浏览器对于JavaScript的同源策略的限制,例如 a.com 下面的js不能调用 b.com 中的js,对象货数据,因为 a.com 和 b.com 是不同域,所以就有了跨域的出现
    那什么才是同域呢?这里简单解释一下 同域就是相同域名,端口相同,协议相同

    同源策略

    说到跨域,我们不得不了解一下什么是同源策略:
    请求的url地址,必须与浏览器上的url地址处于同域上,也就是域名,端口,协议相同,这就是同源策略的保护,如果浏览器对JavaScript没有同源策略的保护,那么一些重要的机密网站将会很危险,具体怎么才是同源,我这里列出来一个表格:

    形式 结果
    同一域名,不同文件夹 成功
    同以域名,同一文件夹 成功
    不同域名,文件夹相同 失败
    同一域名,不同端口号 失败
    同一域名,不同的协议 失败

    下面,我给大家介绍一下解决跨域的几种常见方案:

    jsonp

    通常未来减轻web服务器的负载,我们把js、css、img等静态资源分离到另一条独立域名的服务器上,在html页面中在通过相应的标签从不同的域名下加载静态资源,而被浏览器运行,基于此原理,我们可以通过动态创建script标签,在请求一个带参数的网址实现跨域通信,是目前比较常见的跨域方式
    ps:jsonp解决跨域最大缺点就是只能实现get一种请求

    跨域资源共享(CORS)

    CORS(Cross-Origin Resource Sharing) 跨域资源共享,定义了必须在访问跨域资源时,浏览器和服务器应该如何沟通,CORS背后的基本思想就是使用自定义的HTTP头部让浏览器与服务器进行沟通,从而决定请求或是响应是应该成功还是失败

    xhr.open('post','http://www.aizhoujin.top/u/cors',true)
    xhr.setRquestHeader('Content-Type','application/x-www-from-urlencoded')
    xhr.send()
    

    服务器对于 CORS 的支持,主要就是通过设置Access-Control-Allow-Origin来进行的。如果浏览器检测到相应的设置,就可以允许Ajax进行跨域访问

    document.domin + iframe 跨域

    此方案仅限主域相同,子域不同的跨域应用场景
    实现原理:两个页面都通过js强制设置document.domin为基础主域,就实现了同域

    postMessage跨域

    postMessage() 是HTML5新定义的通信机制,所以主流浏览器都已实现,该API定义在window对象

    otherWindow.postMessage(message,targetOrigin)
    

    message: 要传递的消息
    targetOrigin: 指定目标窗口的源,在发送消息的时候,如果目标窗口的协议,主机地址或端口着三者的任意一项不匹配targetOrigin提供的值,那么消息就不会被发送,只要三者完全匹配,消息才会触发
    当源匹配时,调用 postMessage() 方法时,目标窗口的window对象会触发一个 message 事件,在进行监听事件时,应先判断origin属性,忽略来自未知源的消息

    前端跨域的问题还有很多,解决方案也还有其他,这仅仅是我整理的常用几种方案,有不足的地方,欢迎各位底下评论给我

    相关文章

      网友评论

        本文标题:前端跨域常见问题以及解决方案

        本文链接:https://www.haomeiwen.com/subject/eujseftx.html