完美解决浏览器跨域的几种方法(汇总)


Posted in Javascript onMay 08, 2017

1、什么是跨域问题

在页面中使用js访问其他网站的数据时,就会出现跨域问题,比如在网站中使用ajax请求其他网站的天气、快递或者其他数据接口时,以及hybrid app中请求数据,浏览器会提 示一下错误:

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

2、为什么会出现跨域问题

因为浏览器收到同源策略的限制,当前域名的js只能读取同域下的窗口属性。

同源策略: 不同的域名, 不同端口, 不同的协议不允许共享资源的, 保障浏览器安全。

同源策略时针对浏览器设置的门槛。如果绕过浏览就能实现跨域,所以说早期的跨域都是打着安全路数的擦边球,都可以认为是 hack 处理。

3、现在总结一下解决跨域的几种方法

jsonp 跨域方法

我们提供一个 script 标签. 请求页面中的数据, 同时传入一个回调函数的名字. 服务器端得到名字后, 拼接函数执行格式的字符串. 发送回浏览器. script 在下载代码以后并执行, 执行的就是这个函数调用形式的字符串, 因此就将本地函数调用了.同时拿到了从服务器端得到的数据。

window.name

window对象的name属性是一个很特别的属性,当该window的location变化,然后重新加载,它的name属性可以依然保持不变。那么我们可以在页面A中用iframe加载其他域的页面B,而页面B中用JavaScript把需要传递的数据赋值给 window.name,iframe加载完成之后,页面A修改iframe的地址,将其变成同域的一个地址,然后就可以读出window.name的值了。这个方式非常适合单向的数据请求,而且协议简单、安全。不会像JSONP那样不做限制地执行外部脚本。

document.domain

通过修改document的domain属性,我们可以在域和子域或者不同的子域之间通信。同域策略认为域和子域隶属于不同的域,比如 www.a.com和sub.a.com是不同的域,这时,我们无法在www.a.com下的页面中调用sub.a.com中定义的JavaScript 方法。但是当我们把它们document的domain属性都修改为a.com,浏览器就会认为它们处于同一个域下,那么我们就可以互相调用对方的 method来通信了。

window.postMessage

window.postMessage是HTML5定义的一个很新的方法,这个方法可以很方便地跨window通信。由于它是一个很新的方法,所以在很旧和比较旧的浏览器中都无法使用。

借助于服务器代码来跨域(正向代理、反向代理)

正向代理: 我借助与我的服务器, 像数据服务器发送数据, 我的服务器只需要向数据服务器发送get请求即可

反向代理: 与正向代理类似, 但是不借助于脚本, 而是直接使用 服务器映射 url.

例如: 我们的 url 是 http://studyit.com

数据服务器的 url 是 http://api.botue.com/login

在 apache 配置一个 url 的代理映射

理论上使用 url: http://studyit.com/api 是在网站根目录下找 api 文件夹

但是现在 apache 提供一个映射的功能, 将 /api 映射到 http://api.botue.com

有了这个映射, 那么 访问 http://api.botue.com/login 就可以利用 /api/login来访问了.

反向代理的好处:

不仅实现了跨域( 服务器帮我们实现的 ), 而且访问数据的时候就好像在访问本地服务器一样.如此, 诸如 cookie 等数据就可以直接获得了.

怎么使用 反向代理( 不同的服务器的使用方法不一样 )

1) 找到 httpd.conf 配置文件, 找到里面的 porxy 开头的两个模块加载项. 去掉其注释.

LoadModule proxy_module modules/mod_proxy.so

LoadModule proxy_http_module modules/mod_proxy_http.so

2) 找到虚拟主机的配置文件. 需要谁来做反向代理 就修改谁的配置文件,在虚拟主机的设置中( 就是那一对尖括号中 )添加两个选项

ProxyRequests Off

ProxyPass /abc http://test2.com

3) 重启服务器

CORS 跨域

CORS 是在 es5 之后提出的跨域方案. 只需要在服务器配置一个跨域响应头接口

与jsonp相比的优点:

1、 JSONP只能实现GET请求,而CORS支持所有类型的HTTP请求。

2、 使用CORS,开发者可以使用普通的XMLHttpRequest发起请求和获得数据,比起JSONP有更好的错误处理。

3、 JSONP主要被老的浏览器支持,它们往往不支持CORS,而绝大多数现代浏览器都已经支持了CORS。

代码如下:

客户端:

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta http-equiv="X-UA-Compatible" content="ie=edge">
  <title>Document</title>
</head>
<body>
  <button id="btn">请求</button>
  <script src="./jquery-3.2.0.js"></script>
  <script>
  
    $( '#btn' ).click(function () {

      $.ajax( {
        url: 'http://test2.com/03-index.php',
        success: function ( info ) {
          console.log( info );
        }

      });

    });
  </script>
</body>
</html>

服务器端:

<?php

// header( 'Access-Control-Allow-Origin: *' ); // 允许任意的网站跨域

header( 'Access-Control-Allow-Origin: http://test1.com' );//允许指定网站

echo 'cors 跨域';
?>

以上这篇完美解决浏览器跨域的几种方法(汇总)就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
jQuery LigerUI 使用教程表格篇(1)
Jan 18 Javascript
JavaScript打印网页指定区域的例子
May 03 Javascript
JavaScript 事件绑定及深入
Apr 13 Javascript
js实现商品抛物线加入购物车特效
Nov 18 Javascript
D3.js实现雷达图的方法详解
Sep 22 Javascript
详解angular2实现ng2-router 路由和嵌套路由
Mar 24 Javascript
jQuery基于cookie实现换肤功能实例
Oct 14 jQuery
基于$.ajax()方法从服务器获取json数据的几种方式总结
Jan 31 Javascript
JavaScript遍历数组和对象的元素简单操作示例
Jul 09 Javascript
JavaScript字符串处理常见操作方法小结
Nov 15 Javascript
jQuery 移除事件的方法
Jun 20 jQuery
React 条件渲染最佳实践小结(7种)
Sep 27 Javascript
jQuery中hover方法搭配css的hover选择器,实现选中元素突出显示方法
May 08 #jQuery
Angular.JS内置服务$http对数据库的增删改使用教程
May 07 #Javascript
angular2中router路由跳转navigate的使用与刷新页面问题详解
May 07 #Javascript
Angular2中select用法之设置默认值与事件详解
May 07 #Javascript
Angular.JS中指令ng-if、ng-show/ng-hide和ng-switch的使用教程
May 07 #Javascript
Angular.Js中ng-include指令的使用与实现
May 07 #Javascript
Angular.js中ng-include用法及多标签页面的实现方式详解
May 07 #Javascript
You might like
用PHP实现WEB动态网页静态
2006/10/09 PHP
PHP删除数组中空值的方法介绍
2014/04/14 PHP
php简单判断文本编码的方法
2015/07/30 PHP
纯php生成随机密码
2015/10/30 PHP
Laravel框架实现利用监听器进行sql语句记录功能
2018/06/06 PHP
php实现 master-worker 守护多进程模式的实例代码
2019/07/20 PHP
解决3.01版的jquery.form.js中文乱码问题的解决方法
2012/03/08 Javascript
jQuery查询数据返回object和字符串影响原因是什么
2013/08/09 Javascript
最好用的省市二级联动 原生js实现你值得拥有
2013/09/22 Javascript
zTree插件之单选下拉菜单实例代码
2013/11/07 Javascript
javascript下拉框选项单击事件的例子分享
2015/03/04 Javascript
JavaScript转换二进制编码为ASCII码的方法
2015/04/16 Javascript
jQuery EasyUI 右键菜单--关闭标签/选项卡的简单实例
2016/10/10 Javascript
微信小程序 侧滑删除(左滑删除)
2017/05/23 Javascript
vue和react等项目中更简单的实现展开收起更多等效果示例
2018/02/22 Javascript
解决vue-router进行build无法正常显示路由页面的问题
2018/03/06 Javascript
详解Nodejs get获取远程服务器接口数据
2019/03/26 NodeJs
JavaScript自动生成 年月范围 选择功能完整示例【基于jQuery插件】
2019/09/03 jQuery
[33:19]完美世界DOTA2联赛PWL S2 PXG vs InkIce 第一场 11.26
2020/11/30 DOTA
python 基础教程之Map使用方法
2017/01/17 Python
windows系统下Python环境的搭建(Aptana Studio)
2017/03/06 Python
Python连接Mssql基础教程之Python库pymssql
2018/09/16 Python
Python3 文章标题关键字提取的例子
2019/08/26 Python
PyCharm 专业版安装图文教程
2020/02/20 Python
新手常见Python错误及异常解决处理方案
2020/06/18 Python
浏览器实现移动端高性能css3动画(开启gpu加速)
2013/12/23 HTML / CSS
网站性能延迟加载图像的五种技巧(小结)
2020/08/13 HTML / CSS
eDreams意大利:南欧领先的在线旅行社
2018/11/23 全球购物
adidas马来西亚官网:adidas MY
2020/09/12 全球购物
11月红领巾广播稿
2014/01/17 职场文书
中学生2014国庆节演讲稿:不屈的民族
2014/09/21 职场文书
商业门面租房协议书
2014/11/25 职场文书
详解python中[-1]、[:-1]、[::-1]、[n::-1]使用方法
2021/04/25 Python
教你修复 Win11应用商店加载空白问题
2021/12/06 数码科技
Shell脚本一键安装Nginx服务自定义Nginx版本
2022/03/20 Servers
CSS子盒子水平和垂直居中的五种方法
2022/07/23 HTML / CSS