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 相关文章推荐
javascript中的toFixed固定小数位数 简单实例分享
Jul 12 Javascript
Iframe实现跨浏览器自适应高度解决方法
Sep 02 Javascript
一个不错的js html页面倒计时可精确到秒
Oct 22 Javascript
javascript字符串循环匹配实例分析
Jul 17 Javascript
浅谈angularJS的$watch失效问题的解决方案
Aug 11 Javascript
微信小程序ajax实现请求服务器数据及模版遍历数据功能示例
Dec 15 Javascript
js中this对象用法分析
Jan 05 Javascript
Django+Vue跨域环境配置详解
Jul 06 Javascript
JavaScript 高性能数组去重的方法
Sep 20 Javascript
小程序实现搜索框
Jun 19 Javascript
解决vscode进行vue格式化,会自动补分号和双引号的问题
Oct 26 Javascript
详解Vue的options
May 15 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
56.com视频采集接口程序(PHP)
2007/09/22 PHP
探讨Hessian在PHP中的使用分析
2013/06/13 PHP
PHP用户管理中常用接口调用实例及解析(含源码)
2017/03/09 PHP
繁简字转换功能
2006/07/19 Javascript
js遍历td tr等html元素
2012/12/13 Javascript
js+数组实现网页上显示时间/星期几的实用方法
2013/01/18 Javascript
chrome下img加载对height()的影响示例探讨
2014/05/26 Javascript
jQuery预加载图片常用方法
2015/06/15 Javascript
点评js异步加载的4种方式
2015/12/22 Javascript
JavaScript与ActionScript3两者的同性与差异性
2016/09/22 Javascript
微信小程序 获取微信OpenId详解及实例代码
2016/10/31 Javascript
BootStrap table删除指定行的注意事项(笔记整理)
2017/02/05 Javascript
jQuery实现标签页效果实战(4)
2017/02/08 Javascript
详解js的异步编程技术的方法
2017/02/09 Javascript
基于React实现表单数据的添加和删除详解
2017/03/14 Javascript
vue2.0+ 从插件开发到npm发布的示例代码
2018/04/28 Javascript
jQuery实现遍历XML节点和属性的方法示例
2018/04/29 jQuery
详解Vue中组件的缓存
2019/04/20 Javascript
antd日期选择器禁止选择当天之前的时间操作
2020/10/29 Javascript
Python实现动态加载模块、类、函数的方法分析
2017/07/18 Python
Django 浅谈根据配置生成SQL语句的问题
2018/05/29 Python
python多进程下实现日志记录按时间分割
2019/07/22 Python
python调用Matplotlib绘制分布点图
2019/10/18 Python
Python如何实现单例模式
2016/06/03 面试题
毕业生实习鉴定
2013/12/11 职场文书
《海伦?凯勒》教学反思
2014/04/17 职场文书
最美家庭活动方案
2014/08/31 职场文书
新党章心得体会
2014/09/04 职场文书
吃空饷专项整治方案
2014/10/27 职场文书
专业见习报告范文
2014/11/03 职场文书
员工辞退通知书
2015/04/17 职场文书
省级三好学生主要事迹材料
2015/11/03 职场文书
班主任寄语2016
2015/12/04 职场文书
2016大学军训心得体会
2016/01/11 职场文书
职场干货:简历中的自我评价应该这样写!
2019/05/06 职场文书
如何在CSS中绘制曲线图形及展示动画
2021/05/24 HTML / CSS