javascript跨域有两种情况: 
  1、基于同一父域的子域之间,如:a.c.com和b.c.com 
  2、基于不同的父域之间,如:www.a.com和www.b.com 
  3、端口的不同,如:www.a.com:8080和www.a.com:8088 
  4、协议不同,如:http://www.a.com和https://www.a.com

对于情况34,需要通过后台proxy来解决,具体方式如下: 
  a、在发起方的域下创建proxy程序 
  b、发起方的js调用本域下的proxy程序 
  c、proxy将请求发送给接收方并获取相应数据 
  d、proxy将获得的数据返回给发起方的js

代码和ajax调用一致,其实这种方式就是通过ajax进行调用的

而情况1和2除了通过后台proxy这种方式外,还可以有多种办法来解决:

、document.domain+iframe(只能解决情况1): 
  a、在发起方页面和接收方页面设置document.domain,并将值设为父域的主域名(window.location.hostname) 
  b、在发起方页面创建一个隐藏的iframe,iframe的源是接收方页面 
  c、根据浏览器的不同,通过iframe.contentDocument ||
iframe.contentWindow.document来获得接收方页面的内容 
  d、通过获得的接收方页面的内容来与接收方进行交互 
  这种方法有个缺点,就是当一个域被攻击时,另一个域会有安全漏洞出现。    

  

 动态创建script(也就是jsonp)

  a、在发起方页面动态加载一个script,script的URL指向接收方的一个处理地址(后台),该地址返回的javascript方法会被执行,另外URL中可以传入一  些参数,该方法只支持GET方式提交参数。

  b、加载的script可以在调用跨域js方法后再做一些自己的处理

  

、location.hash+iframe: 

  a、发起方创建一个隐藏的iframe,iframe的源指向接收方的页面,并通过接收方页面的hash值来传送数据 
  b、发起方创建一个定时器,定时检查自己的location.hash并作相应的处理 
  c、接收方创建一个隐藏的iframe,iframe的源指向发起方所在域的一个代理页面,并将接收方根据发起方传入的数据而处理后的数据通过代理页面的hash值来传送 
  d、接收方创建一个定时器,定时检查自己的location.hash并作相应的处理 
  e、代理页面创建一个定时器,定时检查自己的location.hash并同步更新发起方页面的hash值 www.a.com/a.html#aaa,其中#aaa就是location.hash值

  

  

window.name

  a、发起方页面创建一个隐藏的iframe,并且源指向接收方页面 
  b、接收方在自己页面通过script将需要传送的数据放入window.name里 
  c、发起方在iframe的onload方法里将iframe的源改为和自己在同一个域下的代理页面(因为只能是同一个域下才能访问window.name的值) 
  d、获取window.name的值(虽然iframe的源改变了,但是window.name的值不会变) 
  window.name的值差不多可以有2MB大小

  

HTML5的postMessage 

  a、receiverWindow.postMessage(msg,
targetOrigin),receiverWindow就是对接收消息的window的引用,可以是iframe的contentWindow/window.open的返回值/window.frames中的一个;msg就是要发送的消息,string类型;targetOrigin用于限制receiverWindow的URI,包括主域名和端口,使用“*”表示无限制,但是为了安全起见还是需要设置下,以防把消息发送给恶意的网站,如果targetOrigin的URI和receiverWindow的不符,则放弃发送消息。 
  b、接收方通过message事件来获得消息,并且通过event.origin的属性来验证发送方并通过event.data来获得传送的消息内容,event.source来获得发送方的window对象

  

、window.opener

适用于IE6、7,也就是operner hack方法,不过貌似现在已经不管用了,只要打过微软的安全补丁.kb2497640就不能用了 
a、发起方页面创建一个隐藏的iframe,并且源指向接收方页面
 

b、发起方页面通过iframe.contentWindow.opener
= {a: function(params){...}, b: function(params){...} ...}来定义可被接收方调用的方法 
     c、接收方页面通过window.opener.a/window.opener.b来调用发起方定义的方法 
     d、接收方页面通过parent.opener = {c:
function(params){...}, d: function(params){...} ...}来定义可被发起方调用的方法 
     e、发起方页面通过opener.c/opener.d来调用接收方定义的方法

其实原理就是重置opener对象

  

、window.navigator

适用于IE6、7,貌似现在还能用,还没被补丁掉 
   a、发起方页面创建一个隐藏的iframe,并且源指向接收方页面 
   b、发起方页面通过window.navigator.a =
function(params){...}; window.navigator.b = function(params){...}; 来定义被接   收方调用的方法 
   c、接收方页面通过window.navigator.a(params);
window.navigator.b(params);来调用发起方定义的方法 
   d、接收方页面通过window.navigator.c =
function(params){...}; window.navigator.d = function(params){...}; 来定义被发起方调用的方法 
   e、发起方页面通过window.navigator.c(params);
window.navigator.d(params);来调用接收方定义的方法

  

JS常用的7中跨域方式总结的更多相关文章

  1. js常用代码示例及解决跨域的几种方法

    1.阻止默认行为 // 原生js document.getElementById('btn').addEventListener('click', function (event) { event = ...

  2. js中跨域请求原理及2种常见解决方案

    一.同源策略: 说到跨域请求,首先得说说同源策略: 1995年,同源政策是由 Netscape 公司引入浏览器的.目前,所有浏览器都实行了这个政策. 同源策略是浏览器的一种安全策略,所谓同源是指,域名 ...

  3. 【温故知新】——原生js中常用的四种循环方式

    一.引言 本文主要是利用一个例子,讲一下原生js中常用的四种循环方式的使用与区别: 实现效果: 在网页中弹出框输入0   网页输出“欢迎下次光临” 在网页中弹出框输入1   网页输出“查询中……” 在 ...

  4. JS中跨域问题

    这里说的js跨域是指通过js在不同的域之间进行数据传输或通信,比如用ajax向一个不同的域请求数据,或者通过js获取页面中不同域的框架中(iframe)的数据.只要协议.域名.端口有任何一个不同,都被 ...

  5. Javascript几种跨域方式总结

    在客户端编程语言中如javascript,同源策略规定跨域之间的脚本是隔离的,一个域的脚本不能访问和操作另外一个域的绝大部分属性和方法.只有当两个域具有相同的协议,相同的主机,相同的端口时,我们就认定 ...

  6. 几种常用的ajax 跨域请求

      前 言 首先,我们要明白,什么是跨域,为什么要跨域. 由于JS中存在同源策略.当请求不同协议名不同端口号下面的文件时,将会违背同源策略,无法请求成功!需要进行跨域处理! 这篇文章就为大家详细介绍一 ...

  7. 从壹开始前后端分离【 .NET Core2.0 +Vue2.0 】框架之十二 || 三种跨域方式比较,DTOs(数据传输对象)初探

    更新反馈 1.博友@落幕残情童鞋说到了,Nginx反向代理实现跨域,因为我目前还没有使用到,给忽略了,这次记录下,为下次补充.此坑已填 2.提示:跨域的姊妹篇——<三十三║ ⅖ 种方法实现完美跨 ...

  8. SpringBoot系列(八)分分钟学会Springboot多种解决跨域方式

    SpringBoot系列(八) 分分钟学会SpringBoot多种跨域解决方式 往期推荐 SpringBoot系列(一)idea新建Springboot项目 SpringBoot系列(二)入门知识 s ...

  9. js常用工具类.

    一些js的工具类 复制代码 /** * Created by sevennight on 15-1-31. * js常用工具类 */ /** * 方法作用:[格式化时间] * 使用方法 * 示例: * ...

随机推荐

  1. vi find和grep

    linux grep和find命令 linux中强大且常用命令:find.grep 源码搜索:find . -name "*.xml" | xargs grep -Hna &quo ...

  2. 白帽子讲Web安全2.pdf

    XSS构造技巧 利用字符编码: var redirectUrl="\";alert(/XSS/);"; 本身没有XSS漏洞,但由于返回页面是GBK/GB2312编码的“% ...

  3. JAVA虚拟机简介

    Java虚拟机定义 Java虚拟机有多层含义 一套规范:Java虚拟机规范.定义概念上Java虚拟机的行为表现 一种实现:例如HotSpot,J9,JRockit.需要实现JVM规范,但具体实现方式不 ...

  4. vojis1523 NOI2002 贪吃的九头龙

    描述 传说中的九头龙是一种特别贪吃的动物.虽然名字叫“九头龙”,但这只是说它出生的时候有九个头,而在成长的过程中,它有时会长出很多的新头,头的总数会远大于九,当然也会有旧头因衰老而自己脱落. 有一天, ...

  5. 关于PHP程序员解决问题的能力

    这个话题老生长谈了,在面试中必然考核的能力中,我个人认为解决问题能力是排第一位的,比学习能力优先级更高.解决问题的能力既能看出程序员的思维能力,应变能力,探索能力等,又可以看出他的经验.如果解决问题能 ...

  6. 使用 CAS 在 Tomcat 中实现单点登录

    单点登录(Single Sign On , 简称 SSO )是目前比较流行的服务于企业业务整合的解决方案之一, SSO 使得在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统.CAS ...

  7. 理解事件捕获。在限制范围内拖拽div+吸附+事件捕获

    一.实现的效果是在限制范围内拖拽div+吸附+事件捕获. 这里需要理解的是事件捕获,这个事件捕获也是为了兼容div在拖拽过程中,文本不被选中这个问题. 如此良辰美景,拖拽也可以很洒脱哈.先看看图, 二 ...

  8. jquerymobile知识点三:弹出层popup

    弹出层popup很简单,主要就是弹出验证,登陆注册,提交信息之类的,下面是我写好的一个demo... <div data-role="popup" id="popu ...

  9. CentOS Nginx+jdk+tomcat 环境搭建

    一.jdk安装 jdk下载地址:http://www.oracle.com/technetwork/java/javasebusiness/downloads/java-archive-downloa ...

  10. 2014 百度之星题解 1002 - Disk Schedule

    Problem Description 有非常多从磁盘读取数据的需求,包含顺序读取.随机读取.为了提高效率,须要人为安排磁盘读取.然而,在现实中,这样的做法非常复杂.我们考虑一个相对简单的场景. 磁盘 ...