美文网首页
浅谈跨域

浅谈跨域

作者: zhanggongzi | 来源:发表于2018-08-29 20:18 被阅读0次

1.跨域的由来

浏览器为了保证网站安全,如限制a网站的cookie不被b网站读取,故浏览器禁止非同源情况下进行ajax请求,cookie访问,dom操作。非同源是指URL中协议,域名和端口有一项以上不同。然而,在某些特殊的业务场景下,我们需要获取非同源的数据,故诞生了跨域。

2.CORS(Cross-Origin Resource Sharing,跨域资源共享)

CORS是W3C规定的标准跨域方式,其基本思想是使用自定义的http头部让浏览器与服务器进行沟通,从而决定请求或响应是否成功。

与xhr的区别:

1>.cookie不会随请求发送,也不会随响应返回

2>.只能设置http请求头里面的content-type

3>.不能访问响应头信息

浏览器的兼容:

IE8-IE10是xdr(XDomainRequest),其它使用XMLHttpRequest

兼容写法:

function createCorsRequest(method,url){

var xhr = new XMLHttpRequest();

if(“withCredentials” in xhr){

xhr.open(method,url,true);

}else if(typeof XDomainRequest != “undefined”){

xhr= new XDomainRequest();

xhr.open(method,url);

}else{

xhr = null;

}

return xhr;

}

整个CORS通信过程,都是浏览器自动完成,不需要用户参与。对于开发者来说,CORS通信与同源的AJAX通信没有差别,代码完全一样。浏览器一旦发现AJAX请求跨源,就会自动添加一些附加的头信息,有时还会多出一次附加的请求,但用户不会有感觉。

因此,实现CORS通信的关键是服务器。只要服务器实现了CORS接口,就可以跨源通信。

3.其它跨域

1.jsonp

JSONP是服务器与客户端跨源通信的常用方法。最大特点就是简单适用,老式浏览器全部支持,服务器改造非常小。

它的基本思想是,网页通过添加一个<script>元素,向服务器请求JSON数据,这种做法不受同源政策限制;服务器收到请求后,将数据放在一个指定名字的回调函数里传回来。

注意,该请求的查询字符串有一个callback参数,用来指定回调函数的名字,这对于JSONP是必需的,即后台服务器返回的函数名要与URL中参数一致。

写法:

var script = document.createElement(“script”);

script.type = “text/javascript”;

script.src = “http://xx/json/?callback=handlefn”;

document.body.insertBefore(script, document.body.firstChild);

function handlefn(data){console.log(data)}

2.图片ping

一种利用img进行跨域的技术,和jsonp利用<script>元素一样,因为网页可以加载任何网页中的图片。

主要的作用是用于在线广告跟踪浏览量,用户查看页面次数等

用法:

var img = new Image();

img.src = “http://xx.com/img/xx.png”;

img.onload = img.onerror = function(){n=n+1;}

3.Comet

sse和Web Sockets

sse支持长轮训,短轮训和HTTP流

长轮询是跟服务器发起一个http请求后,服务器不是立马返回数据,而是等数据有更新后在返回,返回后客户端在发请求,以此类推。

短轮训则是定时的向服务器发起请求,服务器不管数据有无更新都返回结果,由前端去判断数据是否已经更新。

HTTP流则是在页面整个生命周期内只使用一个http连接。由服务器主动周期性的向客户端推送数据。

web sockets是在一个单独的持久的连接上提供双全工,双向通信,使用的是一种新的通信协议。

总结:

处理ajax的跨域可以选择JSONP、CORS,服务端设置代理、WebSocket。如果主域相同,处理多级子域之间的通信可以选择document.domain,处理不同域之间的iframe,子窗口可以选择window.name、window.postMessage、location.hash来解决。

相关文章

  • 浅谈跨域

    1.跨域的由来 浏览器为了保证网站安全,如限制a网站的cookie不被b网站读取,故浏览器禁止非同源情况下进行aj...

  • 浅谈跨域问题

        对于前端开发的码农们,跨域问题一定不陌生,在我还是个新手时,就曾被跨域问题折磨的欲仙欲死。     之前项...

  • 浅谈跨域劫持

    关闭页面特效 本篇文章主要讲解一下跨域攻击: Jsonp劫持 Flash跨域劫持 CORS跨域资源获取 -----...

  • 深入跨域问题(3) - 利用 JSONP 解决跨域

    深入跨域问题(1) - 初识 CORS 跨域资源共享;深入跨域问题(2) - 利用 CORS 解决跨域深入跨域问题...

  • 关于设置env等环境变量的思考

    1、如何处理跨域后台处理跨域前端处理跨域浏览器处理跨域 前端本地处理跨域:代理线上跨域的处理方式:Nginx反向代...

  • Web前后端跨域问题处理

    跨域问题有前台跨域(iframe间)和后台跨域。 前台跨域的解决方案可以采用跨域文档通讯(Cross domain...

  • 跨域

    跨域 什么是跨域: 解决跨域 通过jsonp原理:在页面引入跨域js和css时,没有存在跨域问题.因此可以动态创建...

  • 跨域问题详解分析

    参考文档 CORS详解 跨域资源共享 CORS 详解 js中几种实用的跨域方法原理详解 跨域的那些事儿 跨域与跨域...

  • 跨域请求

    参考资料:[1]. 浅谈CSRF攻击方式[2]. 跨域资源共享 CORS 详解[3]. 浏览器同源政策及其规避方法...

  • 跨域问题:好几种解决方案

    跨域分为广义跨域和狭义跨域 广义跨域:一个域下的文档或脚本试图去请求另一个域下的资源; 广义跨域可以分为以下几种:...

网友评论

      本文标题:浅谈跨域

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