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


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实现检测浏览器及版本的脚本代码
Jan 22 Javascript
js调试工具 Javascript Debug Toolkit 2.0.0版本发布
Dec 02 Javascript
用jQuery扩展自写的 UI导航
Jan 13 Javascript
屏蔽Flash右键信息的js代码
Jan 17 Javascript
对xmlHttp对象的理解
Jan 17 Javascript
extjs tabpanel限制选项卡数量实现思路及代码
Apr 02 Javascript
jquery对table中各数据的增加、保存、删除操作示例
May 14 Javascript
javascript设置连续两次点击按钮时间间隔的方法
Oct 28 Javascript
jquery获得当前html页面源码的方法
Jul 14 Javascript
javascript实现非常简单的小数取整功能示例
Jun 13 Javascript
浅谈vue中数据双向绑定的实现原理
Sep 14 Javascript
微信小程序签到功能
Oct 31 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
Erlang的运算符(比较运算符,数值运算符,移位运算符,逻辑运算符)
2012/07/23 PHP
Yii2中使用asset压缩js,css文件的方法
2016/11/24 PHP
Laravel开启跨域请求的方法
2019/10/13 PHP
Docker 安装 PHP并与Nginx的部署实例讲解
2021/02/27 PHP
离开页面时检测表单元素是否被修改,提示保存的js代码
2010/08/25 Javascript
javascript算法学习(直接插入排序)
2011/04/12 Javascript
Jquery中显示隐藏的实现代码分析
2011/07/26 Javascript
jquery 页面滚动到底部自动加载插件集合
2014/01/31 Javascript
Javascript 按位左移运算符使用介绍(
2014/02/04 Javascript
JS获得图片alt信息的方法
2015/04/01 Javascript
基于cssSlidy.js插件实现响应式手机图片轮播效果
2016/08/30 Javascript
对称加密与非对称加密优缺点详解
2017/02/06 Javascript
JS及JQuery对Html内容编码,Html转义
2017/02/17 Javascript
Angular2数据绑定详解
2017/04/18 Javascript
微信小程序promsie.all和promise顺序执行
2017/10/27 Javascript
浅谈手写node可读流之流动模式
2018/06/01 Javascript
使用vue2实现带地区编号和名称的省市县三级联动效果
2018/11/05 Javascript
JS前端知识点 运算符优先级,URL编码与解码,String,Math,arguments操作整理总结
2019/06/27 Javascript
js数组相减简单示例【删除a数组所有与b数组相同元素】
2020/03/04 Javascript
[44:26]DOTA2上海特级锦标赛主赛事日 - 2 胜者组第一轮#4EG VS Fnatic第二局
2016/03/03 DOTA
[43:41]OG vs Newbee 2019国际邀请赛淘汰赛 胜者组 BO3 第一场 8.21.mp4
2020/07/19 DOTA
python各种语言间时间的转化实现代码
2016/03/23 Python
老生常谈进程线程协程那些事儿
2017/07/24 Python
Python常用字符串替换函数strip、replace及sub用法示例
2018/05/21 Python
Python实现端口检测的方法
2018/07/24 Python
Python3实现监控新型冠状病毒肺炎疫情的示例代码
2020/02/13 Python
Python实现对adb命令封装
2020/03/06 Python
python保留格式汇总各部门excel内容的实现思路
2020/06/01 Python
Python中的整除和取模实例
2020/06/03 Python
python访问hdfs的操作
2020/06/06 Python
python实现mask矩阵示例(根据列表所给元素)
2020/07/30 Python
HTML5几个设计和修改的页面范例分享
2015/09/29 HTML / CSS
Omio意大利:全欧洲低价大巴、火车和航班搜索和比价
2017/12/02 全球购物
自荐信如何制作?
2014/02/21 职场文书
MySQL基础(二)
2021/04/05 MySQL
python opencv通过4坐标剪裁图片
2021/06/05 Python