关于浏览器跨域问题Access-Control-Allow-Origin

其实很早就接触过前端开发 也处理过跨域问题(当时采用的是jsonp server+client 都要改动。。。。)

现在这段时间也在做这块 记录+整理

跨域问题是什么gui?

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

跨域问题制约哪些操作?

常见的不同域间的页面制约dom元素包括:

window.location 可以设置,但不能读取。其它的 location 属性和方法被禁止访问; 
        document.href 可以设置,但不能读取。其它的 document 属性和方法被禁止访问; 
        <iframe> 的 src 可以设置,但不能读取

ajax访问无返回值??

由于安全原因,跨域访问是被各大浏览器所默认禁止的;但是浏览器并不禁止在页面中引用其他域的JS文件,并可以自由执行引入的JS文件中的function

解决跨域问题

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

  • 使用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是html5新增的一项标准,IE10以下是不支持的,所以如果产品面向的是PC端,就要使用服务端代理或jsonp。

=========================================================================

主要解决方案 :

 jsonp    (jquery-jsonp插件不用服务器做任何事情~~ 完美!!)

服务端代理(通过在同域名下的web服务器端创建一个代理,这个需要在服务器端做 服务器的负荷+++)

<script> 跨域获取资源(要求返回的是正规的js对象格式 如json、js数组)

隐藏iframe、共享domain(只适用在具有同一个父域下的跨域请求上)

时间: 2024-10-18 12:41:53

关于浏览器跨域问题Access-Control-Allow-Origin的相关文章

解决浏览器跨域限制发送ajax请求

一.什么是浏览器跨域限制?本质是什么? 所谓浏览器跨域限制,其实是为了数据安全的考虑由Netscape提出来限制浏览器跨域访问数据的策略,这是一中约定,正式叫法为浏览器同源策略,目前已经在大多数浏览器中支持. 本质上,所谓浏览器同源策略即:不允许浏览器访问跨域的Cookie,ajax请求跨域接口等.也就是说,凡是访问与自己不在相同域的数据或接口时,浏览器都是不允许的. 最常见的例子:对于前后端完全分离的Web项目,前端页面通过rest接口访问数据时,会出现如下问题: 不允许发送POST请求:在发

[Java面试十]浏览器跨域问题.

此块内容参考Ajax文档部分. 主要复习内容: 1.JavaScript核心对象 2.浏览器BOM对象 3.文档对象模型DOM 4.常见事件 5.Ajax编程(web交互2种方式的对比) 6.传统Ajax编程的步骤以及从服务器端返回的数据格式 7.JSON数据格式的转换操作 8.jQuery选择器 9.jQuery的Ajax编程(常见方法) 浏览器跨域问题: json相信大家都用的多,jsonp我就一直没有机会用到,但也经常看到,只知道是“用来跨域的”,一直不知道具体是个什么东西.今天总算搞明白

设置IE浏览器跨域访问数据

在开发中,经常会遇到多站点跨域访问后台服务获取数据的情况,解决方法有两种 自己写代理服务,访问代理服务,代理服务请求服务获取数据再返回: 设置浏览器可以跨域访问数据. 本文来讲如何设置IE浏览器跨域访问数据,步骤如下: 打开[Internet选项],窗口如下 选择标签[安全],图片如下 选中[Internet],选择[自定义级别],图片如下:      如上图,在[其他]目录下,设置[跨域浏览窗口和框架]和[通过域访问数据源]为启用,确定,即设置成功! 如果站点为[本地intranet],则选择

MediaElement.js之浏览器跨域请求视频播放

浏览器跨域问题一直以来都是作为前端开发人员常见的问题,所以今天学习了下如何使浏览器跨域请求资源 需要了解的知识 -域(主域,子域,什么是跨域) 简单来说由于浏览器同源策略,凡是发送请求url的协议(http,https).域名(baidu.com,sina.com).端口(80,81)三者之间任意一与当前页面地址不同即为跨域 详解:http://www.cnblogs.com/dojo-lzz/p/4265637.html -jsonp(这里推荐 http://kb.cnblogs.com/pa

允许火狐浏览器跨域取字体

对于火狐浏览器,需要字体所在服务器设置允许跨域访问.以Apache为例,先开启 headers 模块,再在字体的文件夹里放置一个 .htaccess 文件,里面的内容如下 #允许火狐浏览器跨域取字体 <FilesMatch "\.(ttf|otf|eot|woff)$"> <IfModule mod_headers.c> Header set Access-Control-Allow-Origin "*" </IfModule>

浏览器跨域访问解决方案

浏览器跨域访问解决方案 2015年11月4日 18972次浏览 跨域的概念 跨域大家都知道,不同地址,不同端口,不同级别,不同协议都会构成跨域.例如:about.haorooms.com和www.haorooms.com都会构成跨域.总结起来只要协议.域名.端口有任何一个不同,都被当作是不同的域.下面举例,每两个一组. URL 说明 是否允许通信 http://www.haorooms.com/a.js http://www.haorooms.com/b.js 同一域名下 允许 http://w

浏览器跨域请求之credentials

-时间起源- 前段时间,需要弄个简单的网站出来,访问远程的api服务. 我是这么做的.首先是在搭建一个nodejs服务来运行前端页面.在我请求登录的时候,能成功返回相应的成功信息.然后,当我再次请求读取别的接口的时候,返回的信息确实提示我尚未登录.此时此刻,我一脸蒙逼.明明我已经登陆了啊.后来偶然得知这是因为浏览器的机制问题. -初步解决- 大概的意思是,默认情况下,标准的跨域请求是不会发送cookie等用户认证凭据的.所以,当你再次访问远程api的时候,cookie是不会被带上的,于是乎,服务

跨域请求Access to XMLHttpRequest at &#39;http://localhost/index.php/api/user/login&#39;

ajax访问后台接口遇到报错 解决方法: 在被请求的php文件中加入请求头部 header('Access-Control-Allow-Origin: *'); 例如: 我的后台接口是用laravel框架写的,所以在laravel的index.php中加入请求头部 后台返回的数据 跨域请求Access to XMLHttpRequest at 'http://localhost/index.php/api/user/login' 原文地址:https://www.cnblogs.com/lish

Access control allow origin 简单请求和复杂请求

错误信息: XMLHttpRequest cannot load http://web.image.myqcloud.com/photos/v2/10008653/bhpocket/0/?sign=4FcLKd5B8-p4SkFVUEJtZ1omZT0xNDQ0NzExMDE5JnQ9MTQ0NDcwNzQxOSZyPTEzMDMyMDgzOTAmdT0wJmY9.No 'Access-Control-Allow-Origin' header is present on the requeste

浏览器跨域的细节

关于什么是跨域,一句话可以说清楚,不同协议,不同子域,不同主域, 不同端口.都可以算成跨域.具体的可以去网上进行搜索. 那么今天来说一下具体前后端如何跨域的实现代码. 从前端说起的话 var headers = new Headers(); headers.append('Content-Type', 'application/json'); headers.append('x-node', 'node'); fetch('http://127.0.0.1:3000/users/login',