浅析跨域

1.跨域的原理是什么?
答:跨域主要是浏览器同源策略,有协议,域名,端口号三个原因,浏览器是根据请求中的origin头,如果origin是服务器认识的,那就正常返回,还会带上Access-control-Allow-Origin,如果没有这个,那么浏览器就会判定请求不合法。

2.不能跨域的原因是什么?
答:浏览器不能跨域是为了安全,严格上来说是为了防止CSRF。就是攻击者可以利用我们的身份和名义发送一段恶意的代码,请求也可以,然后利用你的账户的名义去做一些坏事。
如何防止:
1.加验证码的方式。2.在用户访问时加入一个token字段,token必须随机,不可预测,当用户提交请求,请求附带token,服务器会检验token的正确性。3.检测请求中的refer字段(这个用于防盗链比较多),检测其是否符合。

3.如何跨域?
答:主要有
1.jsonp跨域,其原理就是利用script标签中的src属性可以进行不受同源策略的限制,自然不止script标签可以,ifame,img等等拥有src属性的都是可以的。
过程:
{
创建一个script标签,只支持get,将src设置为目标请求,插入到dom中,服务器接受该请求并返回数据,一般放在callback函数中,不仅仅是script可以,img,link,iframe都可以
一、iframe优点:跨域完毕之后DOM操作和互相之间的JavaScript调用都是没有问题的 缺点:1.若结果要以URL参数传递,在结果数据量很大的时候需要分割传递。
二、script 优点:可以直接返回json格式的数据,方便处理
缺点:只接受GET请求方式
三、img优点:可以访问任何url,一般用来进行点击追踪,做页面分析常用的方法
缺点:不能访问响应文本,只能监听是否响应
四:link等其他html标签,只能说html标签任性,不受同源策略限制
缺点:只支持GET这一种单一的请求方式

不可以用post,因为post和xmlhttprequest一定会去检查是否跨域,并不是说GET请求不会去检查,而是JSONP中用script标签中的src属性可以进行不受同源策略的限制。
ajax请求受同源策略影响,不允许进行跨域请求,而script标签src属性中的链接却可以访问跨域的js脚本,利用这个特性,服务端不再返回JSON格式的数据,而是返回一段调用某个函数的js代码,在src中进行了调用,这样实现了跨域。

$.ajax({
    type: "get",
    async: false,
    url: "http://flightQuery.com/jsonp/flightResult.aspx?code=CA1998",
    dataType: "jsonp",
    jsonp: "callback",//传递给请求处理程序或页面的,用以获得jsonp回调函数名的参数名(一般默认为:callback)             
    jsonpCallback:"flightHandler",//自定义的jsonp回调函数名称,默认为jQuery自动生成的随机函数名,也可以写"?",jQuery会自动为你处理数据             
    success: function(json){
});

1、ajax和jsonp这两种技术在调用方式上“看起来”很像,都是请求一个url,然后把服务器返回的数据进行处理,因此jquery框架都把jsonp作为ajax的一种形式进行了封装;
2、但ajax和jsonp其实本质上是不同的东西。ajax的核心是通过XmlHttpRequest获取非本页内容,而jsonp的核心则是动态添加script标签来调用服务器提供的js脚本。
3、ajax与jsonp的区别不在于是否跨域,ajax通过服务端代理一样可以实现跨域,jsonp本身也不排斥同域的数据的获取。
4、jsonp是一种方式或者说非强制性协议,不一定非要用json格式来传递,字符串都行
}

2.两个网页一级域名相同,只是二级域名不同,浏览器允许通过设置document.domain共享 Cookie 2.HTML5为了解决这个问题,引入了一个全新的接口:window.postMessage, window.opener.postMessage(‘Nice to see you’, ‘http://aaa.com’)就可以把’Nice to see you’传递到aaa.com中啦;
3.WebSocket是一种通信协议,使用ws://(非加密)和wss://(加密)作为协议前缀。该协议不实行同源政策,只要服务器支持,就可以通过它进行跨源通信.运用Origin字段,表示该请求的请求源(origin),即发自哪个域名。因为服务器可以根据这个字段,判断是否许可本次通信。
4.window.name浏览器窗口有window.name属性。无论是否同源,只要在同一个窗口里,前一个网页设置了这个属性,后一个网页可以读取它
5.CORS是跨源资源分享(Cross-Origin Resource Sharing)。是跨源AJAX请求的根本解决方法。相比JSONP只能发GET请求,CORS允许任何类型的请求,CORS通信与同源的AJAX通信没有差别,只要服务器实现了CORS接口,就可以跨源通信 2种:简单请求和非简单请求
简单请求: HEAD GET POST,2.HTTP的头信息不超出以下几种字段: Accept Accept-Language Content-Language Last-Event-ID Content-Type:只限于三个值application/x-www-form-urlencoded、multipart/form-data、text/plain, 头信息之中,增加一个Origin字段,本次请求来自哪个源(协议 + 域名 + 端口) 本次请求来自哪个源(协议 + 域名 + 端口),Access-Control-Allow-Origin
非简单请求是那种对服务器有特殊要求的请求,比如请求方法是PUT或DELETE,或者Content-Type字段的类型是application/json 非简单请求的CORS请求,会在正式通信之前,增加一次HTTP查询请求,称为"预检"请求。请求用的请求方法是OPTIONS检查了Origin、Access-Control-Request-Method和Access-Control-Request-Headers字段。 JSONP只支持GET请求,CORS支持所有类型的HTTP请求。JSONP的优势在于支持老式浏览器,以及可以向不支持CORS的网站请求数据。

继续加油,苦练杀敌本领

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值