跨域的几种方法及案例代码

1、通过动态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.appendChild(script);
			}
			window.baidu = {
				sug: function(data) {
					console.log(data);
				}
			}
			loadScript(‘http://suggestion.baidu.com/su?wd=w‘, function() {
				console.log(‘loaded‘)
			});
http://suggestion.baidu.com/su?wd=w加载完成后会输出一段字符串
window.baidu.sug({q:"w",p:false,s:["微信网页版","微信公众平台官网","网易云音乐","王者荣耀","微博","wps","微信公众平台","网易邮箱","王牌对王牌","微信公众号"]});

JS代码中已经定义了window.baidu.sug方法,到这里就相当于调用函数了

2、通过domain+iframe方式

a.html

document.domain="a.com"//注意这里
var ifr = document.createElement("iframe");
			ifr.src = "http://www.4008086628.com/iframe.php";
			ifr.style.display = "none";
			document.body.appendChild(ifr);
			ifr.onload = function(){
				var doc = ifr.contentDocument || ifr.contentWindow.document;
				console.log( doc.getElementsByTagName("body")[0].innerHTML );
				ifr.onload = null
			}

b.html

document.domain="a.com"//注意这里

两个页面的主域必须相同,否则无法实现跨域

www.x.a.com/b.html的主域可以设置成x.a.com、a.com或www.x.a.com但不能设置c.www.a.com,因为这是当前域的子域

3、通过window.name

a.html

function getData(){
				var ifr = document.getElementById("ifr");
				ifr.src = "about:blank";
				ifr.onload = function(){
					var data = ifr.contentWindow.name;
					console.log(JSON.parse(data)[0]);
				}
			}

			function bywinName(){
				var ifr = document.createElement("iframe");
				ifr.src = "http://www.domain.com/b.html";
				ifr.style.display = "none";
				ifr.id = "ifr";
				ifr.onload = function(){
					getData();//b.html设置的window.name是无法直接获取到的,必须设置成和a.html同源的页面才能获取到
				}
				document.body.appendChild(ifr);
			}
			bywinName();

b.html

window.name = ‘[{"zhao" : "30"},{"zhou" : "20"},{"li" : "10"}]‘;

4、通过postMessage实现

a.html

function postMes(){
				var ifr = document.getElementById("ifr");
				var doc = ifr.contentWindow;
				var targetOrigin = "*";
				doc.postMessage("这是来自by-post的信息",targetOrigin);
			}
			function startPost(){
				var ifr = document.createElement("iframe");
				ifr.src = "http://demo.hmrjhj.com/b.html";
				ifr.id ="ifr";
				ifr.style.display = "none";
				ifr.onload = function(){
					postMes();
				}
				document.body.appendChild(ifr);
			}
			startPost();
			window.addEventListener("message",function(event){
				console.log(event.data);
			},false)

b.html

			window.addEventListener("message",function(event){
				console.log(event.data+"hello");
				window.parent.postMessage("已经收到消息","*");
			},false)

5、JSONP

a.html

function getData(res){
				if(!res.errorCode){
					console.log(res.data);
					box.innerHTML = res.data;
				}else{
					console.log(res.errorText);
					box.innerHTML = res.errorText;
				}
			}
			var script = document.createElement("script");
			script.src = "http://www.domain.com/data.php?callback=getData";
			var head = document.getElementsByTagName("head")[0];
			head.appendChild(script)
			var box = document.getElementsByClassName("box")[0];

data.php

header("Content-type: text/html; charset=gb2312");
	$callback = $_GET["callback"];
	$data = ‘{"data" : "zhe"}‘;
	$error = ‘{"errorCode" : "404" , "errorText" : "找不到数据"}‘;
	if($callback==="getData"){
		echo "getData(".$data.")";
	}else{
		echo "getData(".$error.")";
	}

该方法和通过动态script跨域原理是一样的,理解了那个这个自然就理解了

时间: 2024-10-16 19:10:01

跨域的几种方法及案例代码的相关文章

vue开发环境和生产环境里面解决跨域的几种方法

  跨域指浏览器不允许当前页面的所在的源去请求另一个源的数据.源指协议,端口,域名.只要这个3个中有一个不同就是跨域. 这里列举一个经典的列子: #协议跨域 http://a.baidu.com访问https://a.baidu.com: #端口跨域 http://a.baidu.com:8080访问http://a.baidu.com:80: #域名跨域 http://a.baidu.com访问http://b.baidu.com:   现在很多公司都是采用前后分离的方式开发.那么出现经常和会

AJAX实现跨域的三种方法

转 由于在工作中需要使用AJAX请求其他域名下的请求,但是会出现拒绝访问的情况,这是因为基于安全的考虑,AJAX只能访问本地的资源,而不能跨域访问. 比如说你的网站域名是aaa.com,想要通过AJAX请求bbb.com域名中的内容,浏览器就会认为是不安全的,所以拒绝访问. 会出现跨域问题的几种情况: 后台在百度上寻找解决方案解决了这个问题,一共总结出三种方案:代理.JSONP.XHR2(XMLHttpRequest Level 2). 第一种方法 代理:这种方式是通过后台(ASP.PHP.Ja

跨域的几种方法

js中几种实用的跨域方法原理详解(转自:http://www.cnblogs.com/2050/p/3191744.html) 这里说的js跨域是指通过js在不同的域之间进行数据传输或通信,比如用ajax向一个不同的域请求数据,或者通过js获取页面中不同域的框架中(iframe)的数据.只要协议.域名.端口有任何一个不同,都被当作是不同的域. 下表给出了相对http://store.company.com/dir/page.html同源检测的结果: 要解决跨域的问题,我们可以使用以下几种方法:

javascript跨域的几种方法

以下的例子包含的文件均为为 http://www.a.com/a.html .http://www.a.com/c.html 与 http://www.b.com/b.html,要做的都是从a.html获取b.html里的数据 1.JSONP jsonp是利用script标签没有跨域限制的特性,通过在src的url的参数上附加回调函数名字,然后服务器接收回调函数名字并返回一个包含数据的回调函数 function doSomething(data) { // 对data处理 } var scrip

201507152326_《Javascript实现跨域有4种方法——介绍jsonp和html5方法》

一. jsonp方法 1. 原理 在js中,我们直接用XMLHttpRequest请求不同域上的数据时,是不可以的.但是,在页面上引入不同域上的js脚本文件却是可以的. 2. 格式 <script> function doSomething(jsondata) { //todo }; </script> <script>http://example.com/data.php?callback=doSomething</script> 二. 使用HTML5中新

javascript 跨域 的几种方法

1.jsonp方法 转:https://blog.csdn.net/liusaint1992/article/details/50959571 主要实现功能: 1.参数拼装. 2.给每个回调函数唯一命名. 3.在回调成功或请求失败之后删除创建的javascript标签. 需要兼容IE.IE下onerror事件不兼容.这里有对它的模拟实现.在IE下加载失败也能get到. 4.超时功能.超时取消回调.执行error. 5.error事件.可执行自己传入的error事件. 代码封装,调用,以及后台代码

.net设置浏览器缓存和跨域的几种方法

1.自定义过滤器属性 public class NoCacheAttribute : FilterAttribute, IActionFilter { public void OnActionExecuted(ActionExecutedContext filterContext) { //设置浏览器缓存 filterContext.HttpContext.Response.Cache.SetCacheability(HttpCacheability.NoCache); //设置接口跨域 fil

关于跨域的N种方法实践之iframe+domain

一.原理 1.主域相同,子域不同,可以设置document.domain来解决跨域. 2.在http://www.example.com/a.html和http://sub.example.com/b.html两个文件中都加上document.domain = "example.com": 3.通过a.html文件创建一个iframe,去控制iframe的window,从而进行交互. 二.测试方法 1.通过gulp启用两个本地服务器,并在hosts文件映射域名(主域名相同,子域名不同)

Springboot 配置cors 跨域的几种方法

作记录用 请参考https://blog.csdn.net/lizc_lizc/article/details/81155895 第一种: 在每个controller上添加 @CrossOrigin 第二种:使用拦截器 1.方法一 @Configurationpublic class CorsConfig { @Bean public CorsFilter corsFilter() { final UrlBasedCorsConfigurationSource urlBasedCorsConfi