`
weitao1026
  • 浏览: 1052968 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

JS 跨域原因及其解决方案

 
阅读更多

产生跨域问题的原因

跨域问题是浏览器同源策略限制,当前域名的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标签是不受同源策略限制(你可以在你的网页中设置scriptsrc属性问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。

分享到:
评论

相关推荐

    js 跨域解决方案

    本文将深入探讨JavaScript跨域问题及其解决方案,以帮助开发者理解和应对这一问题。 首先,了解同源策略是解决问题的关键。同源策略是浏览器为了保障用户数据安全而实施的一种机制,它禁止了一个源的文档或脚本获取...

    JS跨域访问解决方案总结[参照].pdf

    JS 跨域访问解决方案总结 JS 跨域访问解决方案总结是指在不同域名站点之间进行资源访问的解决方案。默认情况下,脚本访问文档属性等数据采用的是同源策略(Same origin policy),即如果两个页面的协议、域名和端口...

    signalR跨域及解决方案

    总结起来,SignalR 跨域问题的解决方案主要依赖于 CORS 配置,同时可以结合其他技术如 JSONP、代理服务器、IFrame 和 PostMessage,以及 WebSocket 协议,根据实际项目需求选择合适的解决方案。正确配置后,SignalR ...

    JS跨域访问解决方案总结

    JavaScript跨域访问解决方案详解 在Web开发中,由于浏览器的安全策略——同源策略(Same origin policy),一个域名下的脚本无法直接访问另一个不同域名的资源。同源策略规定,只有当两个页面的协议、域名和端口...

    file协议导致的跨域问题以及解决方案.docx

    特别是使用file协议访问本地文件时,常见的跨域问题及其解决方案是开发者不得不面对的问题。 首先,同源策略要求“协议+域名+端口”完全一致的请求才被认为是同源。基于这种策略,如果一个文档包含来自不同源的资源...

    跨域访问解决方案,关于跨域访问cookie的资料

    为了解决这一问题,并确保在跨域场景下可以正确地处理Cookie信息,本文将详细介绍几种常用的跨域访问解决方案及其在处理Cookie方面的应用。 #### 一、跨域访问解决方案概述 跨域访问是指一个域名下的文档或脚本...

    Ajax跨域问题及解决方案(jsonp,cors)

    解决方案: 1.jsonp  在远程服务器上设法动态的把数据装进js格式的文本代码段中,供客户端调用和进一步处理;在前台通过动态添加script标签及src属性,表面看上去与ajax极为相似,但是,这和ajax并没有任何关系;...

    js解决跨域访问问题

    本文将详细介绍跨域访问产生的原因,并给出具体的解决方案及其示例代码。 #### 二、同源策略 同源策略(Same-origin policy)是Web安全的一项基本政策,它的主要目的是保护用户的数据安全,防止恶意网站通过脚本...

    JavaScript 跨域通信方法

    本文重点介绍了两种类型的跨域问题及其解决方案。对于不同源的接口请求,可以采用JSONP或XMLHttpRequest Level 2等技术;而对于父子页面间的通信,则可以通过代理页面或`postMessage` API来实现。开发者可以根据实际...

    前端跨域原理以及跨域解决方案.docx

    ### 前端跨域原理及解决方案详析 #### 一、引言 在现代互联网技术的快速发展下,跨域问题成为了许多前端开发者不可避免的技术挑战之一。本文将深入探讨前端跨域的基本概念、原理及其解决方案,帮助开发者更好地...

    CORS跨域资源共享及解决方案.docx

    ### CORS跨域资源共享及其解决方案详解 #### 一、CORS跨域资源共享背景 在现代Web应用开发中,前后端分离已成为一种主流趋势。在这种模式下,前端负责展示逻辑,而后端处理业务逻辑与数据交互。然而,由于浏览器...

    iframe跨域通信解决方法

    尤其是在使用`iframe`嵌入不同源的内容时,主页面往往无法直接与`iframe`内的内容进行交互,这就需要一种解决方案来实现跨文档消息传递。本文档将详细介绍如何在Vue项目或普通Web页面中利用`postMessage`API来实现`...

    web跨域解决方案.docx

    Web 跨域解决方案 在 Web 开发中,跨域问题是一个常见的问题。跨域问题是指一个域下的脚本无法访问另一个域下的资源的安全限制。这种限制是由浏览器的同源策略(Same-Origin Policy)所引起的。同源策略规定,...

    Vue中跨域及打包部署到nginx跨域设置方法

    ### Vue项目中的跨域解决方案 在Vue项目中,通常可以通过配置代理来解决开发阶段的跨域问题。以vue-cli搭建的项目为例,可以在webpack配置文件`/config/index.js`中设置`proxyTable`属性来配置代理。 ```...

    解决跨域问题方案实例

    本文将详细解析跨域问题及其解决方案,重点关注JavaScript中的Ajax请求,并结合Java环境下的处理策略。 首先,我们需要理解“浏览器限制”是什么。浏览器出于安全考虑,实施了一项名为同源策略(Same-Origin Policy...

    JSP使用ajaxFileUpload.js实现跨域问题.docx

    为了解决这个问题,很多前端框架提供了相应的解决方案,如jQuery的`$.ajax`方法支持JSONP等方式来实现跨域请求。 本文主要介绍如何在JSP项目中使用`ajaxFileUpload.js`插件解决跨域文件上传的问题,并提供了一个...

    jQuery跨域问题解决方案

    在标题“jQuery跨域问题解决方案”中提到的JSONP(JSON with Padding)便是其中一种。JSONP允许跨域访问,其工作原理是允许用户传递一个回调函数名给服务器,然后服务器将返回一段JavaScript代码,其中包括了调用该...

    基于HTML和JavaScript的Ajax简介及跨域解决方案设计源码

    本项目为基于HTML和JavaScript的Ajax技术实践,集成了36个文件,涵盖17个HTML文件、13个JavaScript文件、4个Markdown说明文档...内容涉及Ajax基础简介及其在解决跨域问题中的应用,提供了详细的源代码和解决方案设计。

    跨域有几种解决方式?原理是什么?跨域.docx

    ### 跨域问题及其解决方案 #### 一、跨域概念 在前端开发中,经常会遇到“跨域”问题。所谓跨域,是指浏览器为了安全考虑实施的一种策略——同源策略(Same-origin policy)。简单来说,当一个网页文档或脚本尝试...

Global site tag (gtag.js) - Google Analytics