javascript跨域原因以及解决方案分享


Posted in Javascript onApril 08, 2015

产生跨域问题的原因

跨域问题是浏览器同源策略限制,当前域名的js只能读取同域下的窗口属性。

跨域问题产生的场景

当要在在页面中使用js获取其他网站的数据时,就会产生跨域问题,比如在网站中使用ajax请求其他网站的天气、快递或者其他数据接口时以及hybrid app中请求数据,浏览器就会提示以下错误。这种场景下就要解决js的跨域问题。

XMLHttpRequest cannot load http://你请求的域名. No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://当前页的域名' is therefore not allowed access.

哪些情况会产生跨域问题

一个网站的网址组成包括协议名,子域名,主域名,端口号。比如 https://github.com/ ,其中https是协议名,www是子域名,github是主域名,端口号是80,当在在页面中从一个url请求数据时,如果这个url的协议名、子域名、主域名、端口号任意一个有一个不同,就会产生跨域问题。
即使是在 http://localhost:80/ 页面请求 http://127.0.0.1:80/ 也会有跨域问题

解决跨域问题

解决跨域问题有以下一种方式

使用jsonp
服务端代理
服务端设置Request Header头中Access-Control-Allow-Origin为指定可获取数据的域名

jsonp的解决方式

json≠jsonp

原理

jsonp解决跨域问题的原理是,浏览器的script标签是不受同源策略限制(你可以在你的网页中设置script的src属性问cdn服务器中静态文件的路径)。那么就可以使用script标签从服务器获取数据,请求时添加一个参数为callbakc=?,?号时你要执行的回调方法。

前端实现

以jQuery2.1.3的ajax方法为例

$.ajax({

    url:"",

    dataType:"jsonp",

    data:{

        params:""

        }

}).done(function(data){

    //dosomething..

})

仅仅是客户端使用jsonp请求数据是不行的,因为jsonp的请求是放在script标签中的,和普通请求不同的地方在于,它请求到的是一段js代码,如果服务端返回了json字符串,那么浏览器就会报错。所以jsonp返回数据需要服务端做一些处理。

服务端返回数据处理

上面说了jsonp的原理是利用script标签来解决跨域,但是script标签是用来获取js代码的,那么我们怎么获取到请求的数据呢。

这就需要服务端做一些判断,当参数中带有callback属性时,返回的type要为application/javascript,把数据作为callback的参数执行。下面是jsonp返回的数据的格式示例

/**/ typeof jQuery21307270454438403249_1428044213638 === 'function' && jQuery21307270454438403249_1428044213638({"code":1,"msg":"success","data":{"test":"test"}});

这是express4.12.3关于jsonp的实现代码

// jsonp
 if (typeof callback === 'string' && callback.length !== 0) {
 this.charset = 'utf-8';
 this.set('X-Content-Type-Options', 'nosniff');
 this.set('Content-Type', 'text/javascript');

 // restrict callback charset
 callback = callback.replace(/[^\[\]\w$.]/g, '');

 // replace chars not allowed in JavaScript that are in JSON
 body = body
  .replace(/\u2028/g, '\\u2028')
  .replace(/\u2029/g, '\\u2029');

 // the /**/ is a specific security mitigation for "Rosetta Flash JSONP abuse"
 // the typeof check is just to reduce client error noise
 body = '/**/ typeof ' + callback + ' === \'function\' && ' + callback + '(' + body + ');';
 }

服务端设置Access-Control-Allow-Origin

这种方式只要服务端把response的header头中设置Access-Control-Allow-Origin为制定可请求当前域名下数据的域名即可。一般情况下设为即可。这样客户端就不需要使用jsonp来获取数据。
关于Access-Control-Allow-Origin设为是否会有安全问题,知乎上有个讨论。

http://www.zhihu.com/question/22992229

浏览器支持

Access-Control-Allow-Origin是html5新增的一项标准,IE10以下是不支持的,所以如果产品面向的是PC端,就要使用服务端代理或jsonp。

以上所述就是本文的全部内容了,希望能够对大家学习javascript跨域有所帮助。

Javascript 相关文章推荐
jQuery 白痴级入门教程
Nov 11 Javascript
Javascript自定义函数判断网站访问类型是PC还是移动终端
Jan 10 Javascript
登陆成功后自动计算秒数执行跳转
Jan 23 Javascript
JavaScript中的prototype原型学习指南
May 09 Javascript
在web中js实现类似excel的表格控件
Sep 01 Javascript
js实现右键自定义菜单
Dec 03 Javascript
js判断iframe中元素是否存在的实现代码
Dec 24 Javascript
jQuery+HTML5实现弹出创意搜索框层
Dec 29 Javascript
JavaScript模块化之使用requireJS按需加载
Apr 12 Javascript
webpack将js打包后的map文件详解
Feb 22 Javascript
vue+element 实现商城主题开发的示例代码
Mar 26 Javascript
如何用vue实现网页截图你知道吗
Nov 17 Vue.js
JavaScript 里的类数组对象
Apr 08 #Javascript
cookie的secure属性详解
Apr 08 #Javascript
jQuery简单tab切换效果实现方法
Apr 08 #Javascript
JavaScript中的普通函数与构造函数比较
Apr 07 #Javascript
jQuery控制cookie过期时间的方法
Apr 07 #Javascript
JavaScript随机生成信用卡卡号的方法
Apr 07 #Javascript
JavaScript实现信用卡校验方法
Apr 07 #Javascript
You might like
PHP链接MySQL的常用扩展函数
2014/10/23 PHP
php 算法之实现相对路径的实例
2017/10/17 PHP
PHP实现数组根据某个单元字段排序操作示例
2018/08/01 PHP
javascript之bind使用介绍
2011/10/09 Javascript
Ext JS 4官方文档之三 -- 类体系概述与实践
2012/12/16 Javascript
深入理解JavaScript中的传值与传引用
2013/12/09 Javascript
jQuery 删除或是清空某个HTML元素示例
2014/08/04 Javascript
JS数组(Array)处理函数整理
2014/12/07 Javascript
jQuery实现鼠标点击弹出渐变层的方法
2015/07/09 Javascript
详解JS面向对象编程
2016/01/24 Javascript
jQuery在ie6下无法设置select选中的解决方法详解
2016/09/20 Javascript
浅谈javascript:两种注释,声明变量,定义函数
2016/10/05 Javascript
Javascript动画效果(2)
2016/10/11 Javascript
JS实现侧边栏鼠标经过弹出框+缓冲效果
2017/03/29 Javascript
JavaScript 隐性类型转换步骤浅析
2018/03/15 Javascript
js jquery 获取某一元素到浏览器顶端的距离实现方法
2018/09/05 jQuery
优雅的elementUI table单元格可编辑实现方法详解
2018/12/23 Javascript
微信小程序实现日历效果
2018/12/28 Javascript
Bootstrap告警框(alert)实现弹出效果和短暂显示后上浮消失的示例代码
2020/08/27 Javascript
[54:10]完美世界DOTA2联赛PWL S2 Magma vs FTD 第二场 11.29
2020/12/03 DOTA
kNN算法python实现和简单数字识别的方法
2014/11/18 Python
Python中断言Assertion的一些改进方案
2016/10/27 Python
Python多进程并发与多线程并发编程实例总结
2018/02/08 Python
numpy中的meshgrid函数的使用
2019/07/31 Python
Python 3 使用Pillow生成漂亮的分形树图片
2019/12/24 Python
aec加密 php_php aes加密解密类(兼容php5、php7)
2021/03/14 PHP
css3实现小箭头各种图形效果
2020/07/08 HTML / CSS
运动会解说词100字
2014/01/31 职场文书
院领导写的就业推荐信
2014/03/09 职场文书
活动总结怎么写啊
2014/05/07 职场文书
义务教育学校标准化建设汇报材料
2014/08/16 职场文书
档案工作汇报材料
2014/08/21 职场文书
红旗渠导游词
2015/02/09 职场文书
停水通知
2015/04/16 职场文书
python+opencv实现视频抽帧示例代码
2021/06/11 Python
python热力图实现的完整实例
2022/06/25 Python