前端跨域问题的几种解决方案

前端跨域问题

一:同源策略
  1.what's this
    所谓同源是指,域名,协议,端口相同。当浏览器运行一个JS脚本时会进行同源检测,如果不同源是不能执行的。
  2.源继承
    来自about:blank,javascript:和data:URLs中的内容,继承了将其载入的文档所指定的源,因为它们的URL本身未指定任何关于自身源的信息。
  3.变更源
    变更源可以实现基础域相同的不同页面的跨域问题。
    如:a.baidu.com/index.html 通过 iframe 引入 b.baidu.com/index.html ,但是a中的JS是不可以操作b中的内容的,但是可以通过修改源来实现。需要在a和b中都修改domain,即 document.domain = 'baicu.com'
    注意:document.doamin的修改必须是当前域或者当前域的基础域,如在a中document.domain = 'b.baidu.com'是报错的
二:跨域方案

  共有几种解决方案:

  (1)document.domain + iframe

  (2)动态创建script

  (3)window.name + iframe

  (4)window.postMessage

  (5)CORS

  (6)JSONP

  (7)nginx代理


  1.document.domain + iframe

    这种方式就是上面说的变更源
    在a.name.com/a.html中

document.domain = 'a.com';var ifr = document.createElement('iframe');
ifr.src = 'http://b.name.com/b.html';
ifr.display = none;
document.body.appendChild(ifr);ifr.onload = function(){var doc = ifr.contentDocument || ifr.contentWindow.document;//在这里操作doc,也就是b.htmlifr.onload = null;
};

    在b.name.com/b.html中

document.domain = 'name.com';

  2.动态创建script

  因为script标签不受同源策略的限制

function loadScript(url, func) {var head = document.head || document.getElementByTagName('head')[0];var script = document.createElement('script');script.src = url;script.onload = script.onreadystatechange = function(){if(!this.readyState || this.readyState=='loaded' || this.readyState=='complete'){func();script.onload = script.onreadystatechange = null;}};head.insertBefore(script, script[0]);
}
window.baidu = {sug: function(data){console.log(data);}
}
loadScript('https://www.baidu.com',function(){console.log('loaded')});

  3.window.name + iframe

  window对象有个name属性,该属性有个特征:即在一个窗口(window)的生命周期内,窗口载入的所有的页面都是共享一个window.name的,每个页面对window.name都有读写的权限,window.name是持久存在一个窗口载入过的所有页面中的,并不会因新页面的载入而进行重置

  a.com/a.html

<!DOCTYPE html>
<html><head><meta charset="utf-8"><title></title><script>function getData(){//此时window.name已被修改为b.com/b.html页面设置的数据var iframe = document.getElementById('proxy');iframe.onload = function(){var data = iframe.contentWindow.name;//获取iframe中window.name,也就是b.com/b.html页面设置的数据alert(data);}iframe.src = 'about:block'; //赊着src的目的是为了让iframe与当前页面同源。src被修改后会重新load然后触发上面的onload}</script></head><body><iframe id="proxy" src="b.com/b.html" οnlοad="getData()"></iframe></body>
</html>

  4.postMessage(HTML5中的XMLHttpRequest Level 2中的API)

  window.postMessage(message,targetOrigin)  方法是html5新引进的特性,可以使用它来向其它的window对象发送消息,无论这个window对象是属于同源或不同源,目前IE8+、FireFox、Chrome、Opera等浏览器都已经支持window.postMessage方法。

  调用postMessage方法的window对象是指要接收消息的那一个window对象,该方法的第一个参数message为要发送的消息,类型只能为字符串;第二个参数targetOrigin用来限定接收消息的那个window对象所在的域,如果不想限定域,可以使用通配符 *  。

  需要接收消息的window对象,可是通过监听自身的message事件来获取传过来的消息,消息内容储存在该事件对象的data属性中。

  上面所说的向其他window对象发送消息,其实就是指一个页面有几个框架的那种情况,因为每一个框架都有一个window对象。在讨论第二种方法的时候,我们说过,不同域的框架间是可以获取到对方的window对象的,而且也可以使用window.postMessage这个方法。下面看一个简单的示例,有两个页面

  a.com/index.html

<!DOCTYPE html>
<html><head><meta charset="utf-8"><title></title><script>var iframe = document.getElementById('iframe');iframe.contentWindow.postMessage('我是a.com/index.hmtl的消息', '*');</script></head><body><iframe id="iframe" src="b.com/index.html"></iframe></body>
</html>

  b.com/index.html

<script>window.onmessage = function(e){e = e || event;alert(e.data)}
</script>

  5.CORS(Cross-Origin Resource Sharing)

  跨源资源共享(CORS)是通过客户端+服务端协作声明的方式来确保请求安全的。服务端会在HTTP请求头中增加一系列HTTP请求参数(例如Access-Control-Allow-Origin等),来限制哪些域的请求和哪些请求类型可以接受,而客户端在发起请求时必须声明自己的源(Orgin),否则服务器将不予处理,如果客户端不作声明,请求甚至会被浏览器直接拦截都到不了服务端。

  前端:

function getHello() {var xhr = new XMLHttpRequest();xhr.open("post", "https://b.example.com/Test.ashx", true);xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");    xhr.onreadystatechange = function () {if (xhr.readyState == 4 && xhr.status == 200) {var responseText = xhr.responseText;console.info(responseText);}}xhr.send();
}

  服务端:(https://b.example.com/Test.ashx)

header('Access-Control-Allow-Origin:*')

  *也可以指定具体的来源

  6.JSONP

function handleResponse(response){console.log('The responsed data is: '+response.data);
}
var script = document.createElement('script');
script.src = 'http://www.baidu.com/json/?callback=handleResponse';
document.body.insertBefore(script, document.body.firstChild);

  7.Nginx反向代理

  前端调用的服务 /apis/xxxx/xxxx  和当前页是同源的,nginx来做一个代理到想要的地方,来实现跨域

  nginx.conf 配置一个反向代理路径

location /apis {rewrite ^.+apis/?(.*)$ /$1 break;include uwsgi_params;proxy_pass http://www.baicu.com/xxxx
}

  

  好了,就总结这么多,慢慢消化。

转载于:https://www.cnblogs.com/xinxingyu/p/6075881.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/356483.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

在OpenShift上部署Java EE微服务

我昨天用WildFly Swarm在博客上发布了有关简单JAX-RS微服务的博客。 您学习了如何使用Maven构建一个所谓的“胖子”&#xff0c;还使用Maven Docker插件对我们的微服务进行了Docker化并在Docker Machine上本地运行。 这是在本地测试事物的好方法。 到目前为止&#xff0c;缺少的…

rocketmq 订阅组_必须先理解的RocketMQ入门手册,才能再次深入解读

推荐阅读一下下2020年后想跳槽&#xff1f;MQ、ZK、Nginx、Kafk等分布式技术你都掌握了&#xff1f;阿里架构师推荐学习的《RabbitMQ实战指南》&#xff0c;渣渣的你都看过吗&#xff1f;RocketMQ入门手册RocketMQ是一个分布式、队列模型的开源消息中间件&#xff0c;前身是Met…

关于返回按钮的事情

在微信的项目涉及到多个不同的项目间跳转那么头部的返回按钮怎么办呢&#xff1f; 在项目之间跳转还有在微信菜单进入页面时我们用了一个中转页进行参数处理和页面跳转判断 目前要用到code&#xff0c;userId等从后端写好的带参数的url到前端获取然后去调用后端的一个校验code和…

.net数据源控件绑定mysql_理解asp.net中DropDownList编辑数据源,绑定数据库数据。...

一、理解asp.net绑定数据库终于学习到了连接数据库部分的内容&#xff0c;杨中科老师视频看起来挺轻松的&#xff0c;如果是高清版就更ok了。我发现我学习新的编程语言会有一个特点&#xff0c;都想要赶紧学习数据库&#xff0c;数据就是一切&#xff0c;有了数据才能操作一切的…

jetty代理jetty_如何在Jetty中使用SPDY

jetty代理jettySPDY是Google提出的一种新协议&#xff0c;是针对网络的新协议。 SPDY与HTTP兼容&#xff0c;但尝试通过压缩&#xff0c;多路复用和优先级降低网页负载。准确地说&#xff0c;快速的目标是&#xff1a;&#xff08; http://dev.chromium.org/spdy/spdy-whitepap…

五指棋,贪吃蛇,中国银行ATM源码链接

https://i.cnblogs.com/Files.aspx 转载于:https://www.cnblogs.com/weixiaoling/p/6083710.html

mysql select db error_select error:不能用DB-library(如isql)不能用DB-library(如isql

在我们php连接mssql出现select error:不能用DB-library(如isql)或odbc3.7或更早版本将ntext数据或仅使用Unicode排序规则的Unicode数据发送到客户端不能用DB-Library(如 ISQL)或 ODBC 3.7或更早版本将 ntext 数据Warning: mssql_query() [function.mssql- query]: message: 不能…

排序算法之二分治法

MERGE(A,p,q,r) n1 q-p1 n2 r-q let L[1..n_11] and R[1..n_21] be new arraysfor i 1 to n_1   L[i] A[pi-1]for j 1 to n_2   R[j] A[qj] L[n_11] \infty R[n_21] \infty i 1 j 1for k p to r   ifL[i] \leq R[j]     A[k] L[i]     i i1else A[k…

将Java EE与jOOQ结合使用的初学者指南

Java EE附带了自己的持久性API&#xff1a;JPA。 当您想要将RDBMS实体&#xff08;表/关系&#xff09;映射到Java实体&#xff08;类&#xff09;时&#xff0c;JPA最强大&#xff0c;主要遵循1&#xff1a;1映射策略。 其背后的想法是&#xff0c;业务逻辑通常并不像关系代数…

niva mysql_Nivacat for mysql是一种第三方提供的()_学小易找答案

【单选题】以下不包括在OSI环境中的是【单选题】以下不是直接推动新疆建省原因的选项是( ) (3.0分)【填空题】TOEFL stands for 1____________________________. More than four thousand American universities and other schools require students seeking 2________ to take…

清理SYSAUX表空间

1.查看SYSAUX表空间中数据分布情况 col SEGMENT_NAME for a30 set lines 999 select * from (select segment_name,PARTITION_NAME,segment_type,bytes/1024/1024 from dba_segments where tablespace_nameSYSAUX order by 4 desc) where rownum<10; 2.删除WRH$_LATCH_CHILD…

mysql备份需要停应用吗_对于含有innodb表的实例进行文件拷贝备份时必须停mysql实例吗...

展开全部在实际环境中&#xff0c;62616964757a686964616fe59b9ee7ad9431333361313261时不时需要备份恢复单个或多个表(注意&#xff1a;这里除非明确指定&#xff0c;所说的表一律指InnoDB表)&#xff0c;而对于innodb引擎恢复单个表需要整体的恢复&#xff0c;xtrabackup也可…

Apache Camel 2.16发布–十大亮点

Apache Camel 2.16于上周五发布。 这篇博客文章是我尝试在此新版本中进行前10名&#xff08;加1作为奖励&#xff09;的亮点。 1.动态到 来自骆驼用户的最常见的常见问题是如何将消息发送到端点&#xff0c;uri应该使用消息中的动态值&#xff08;例如标头&#xff09;。 在…

[原创软件]体验组批量加分工具

软件主要功能&#xff1a; 从excel批量导入用户QQ、昵称、年龄信息批量粘贴用户QQ或昵称进行筛选批量添加积分软件界面截图&#xff1a; 开发环境及语言&#xff1a; c#.NET Framework 4.0Visual Studio 2015更新日志&#xff1a; v1.2&#xff08;2016.9.30&#xff09; 增加格…

java8 filter return_java8新特性Java 8 Streams filter示例 - Java教程

在这篇教程中我将向你展示 filter(), collect(), findAny() 和 orElse() 的用法1. Streams filter() 和 collect()1.1 在 Java 8 以前, 像下面这样过滤一个 List:BeforeJava8.javapackage com.mkyong.java8;import java.util.ArrayList;import java.util.Arrays;import java.ut…

java 线性表的表示和实现_线性表中顺序表的的理解和实现(java)

线性表的顺序表示指的是用一组地址连续的存储单元以此存储线性表的数据元素&#xff0c;这种表示也称作线性表的顺序存储结构或顺序映像。通常&#xff0c;称这种存储结构的线性表为顺序表。特点是&#xff1a;逻辑上相邻的数据元素&#xff0c;其物理次序上也是相邻的。顺序表…

akka连接是什么_什么是Akka?

akka连接是什么在深入探讨什么是Akka之前&#xff0c;让我们退后一步来了解并发编程的概念在应用程序开发世界中是如何演变的。 应用程序已从大型的整体程序演变为面向对象的模型。 随着Java EE和Spring框架的出现&#xff0c;应用程序设计演变为更多的基于流程或任务的设计模型…

java socket 判断断网_java socket 判断对方在线或离线、断线

1 在客户端和服务器端做心跳检测(这个后来我放弃了)2 客户端中断连接&#xff0c;服务器会抛出异常&#xff0c;利用这点3这是我为什么不用心跳包的原因&#xff0c;因为不需要了。 有的时候&#xff0c;我们可能网络突然中断了。但是服务器依然会监听那个连接。而且很长都不抛…

java 可重入读写锁 ReentrantReadWriteLock 详解

详见&#xff1a;http://blog.yemou.net/article/query/info/tytfjhfascvhzxcyt206 读写锁 ReadWriteLock读写锁维护了一对相关的锁&#xff0c;一个用于只读操作&#xff0c;一个用于写入操作。只要没有writer&#xff0c;读取锁可以由多个reader线程同时保持。写入锁是独占的…

将JPA Hibernate与OptaPlanner集成

我们一直在改进OptaPlanner与JEE其余部分的集成&#xff0c;因此&#xff0c;构建可以正常工作的最终用户应用程序更加容易。 让我们看一下改进的JPA Hibernate集成。 基础 JPA Hibernate和OptaPlanner都可以在POJO&#xff08;普通的旧Java对象&#xff09;上工作&#xff0c…