前端跨域杂谈

1、前端跨域之表单(post)

项目需求,需要跨域向另一台服务器传送大量值,从ajax角度跨域是get方式,基于此,方案采用构造<form>表单,通过action发送到对方服务器,对方服务器需要做一些配合。

发送方post.html

<!DOCTYPE html>

<html>

<head>

<meta charset="utf-8" />

<meta content="width=device-width, initial-scale=1.0, maximum-scale=1.0,minimum-scale=1.0, user-scalable=no" name="viewport">

</head>

<body>

<script>

function postcallback(data){

}

</script>

<form action="http://10.16.92.34:81/xampp/index.php" method="post" target="ifr-result">

<input type="text" name="data" />

<input type="submit" value="提交" />

</form>

<iframe name="ifr-result"></iframe>

</body>

</html>

对方服务器接收index.php

<?php

$data = ‘{"ret": 0, "msg": "ok"}‘;

// 结果跳转到当前域执行

header("Location: http://10.16.92.34:81/xampp/ifr-callback.php?data=".urlencode($data));

重定向到同域名服务内部处理 ifr-callback.php

<?php

header(‘Content-type: text/javascript‘);

echo ‘<script>‘;

//回调原页面上函数处理返回结果

echo ‘parent.postcallback(‘ .$_GET[‘data‘]. ‘);‘;

echo ‘</script>‘;

2、前端跨域之CORS (post)

CORS跨域资源共享:定义一种浏览器和服务器交互的方式来确定是否允许跨域请求。

详细内容:

前端代码:post.html

<!DOCTYPE html>

<html>

<head>

<meta charset="utf-8" />

<meta content="width=device-width, initial-scale=1.0, maximum-scale=1.0,minimum-scale=1.0, user-scalable=no" name="viewport">

</head>

<body>

<script>

var xhr = new XMLHttpRequest();

xhr.open("GET", "http://10.16.92.34:81/xampp/index.php", true);

xhr.send();

xhr.onreadystatechange = ajaxCallback;

function ajaxCallback(data) {

if (xhr.readyState == 4 && xhr.status == 200) {

console.log(data);

console.log(data.srcElement.responseText);

}

}

</script>

</body>

</html>

服务端对于CORS的支持,主要就是通过设置Access-Control-Allow-Origin来进行的。

index.php

<?php

header("Access-Control-Allow-Origin:*");

$data = ‘{"ret": 0, "msg": "ok"}‘;

// 结果跳转到当前域执行

header("Location: http://10.16.92.34:81/xampp/ifr-callback.php?data=".urlencode($data));

ifr-callback.php

<?php

header("Access-Control-Allow-Origin:*");

header(‘Content-type: text/json‘);

//回调原页面上函数处理返回结果

echo $_GET[‘data‘];

3、H5跨域postMessage

a)在Web Workers中使用postMessage和onmessage

step1:准备一个主线程页面work.html

<html>

<head>

<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

<title>Test Web worker</title>

<script type="text/JavaScript">

function init() {

var worker = new Worker(‘http://res.imtt.qq.com/cloud_based_adp/sdktagdemo/js/compute.js‘);

//event 参数中有 data 属性,就是子线程中返回的结果数据

worker.onmessage= function (event) {

// 把子线程返回的结果添加到 div 上

document.getElementById("result").innerHTML +=

event.data + "<br/>";

};

}

</script>

</head>

<body onload="init()">

<div id="result"></div>

</body>

</html>

step2:向主线程发送信息-compute.js

var i = 0;

function timedCount() {

for (var j = 0, sum = 0; j < 100; j++) {

for (var i = 0; i < 100000000; i++) {

sum += i;

}

}

// 调用 postMessage 向主线程发送消息

postMessage(sum);

}

postMessage("Before computing,"+new Date());

timedCount();

postMessage("After computing,"+new Date());

b)跨域文档通信使用postMessage和onmessage

step1:假设在A域构造一个页面cross-domain.html页面(通过iframe嵌入一个子页面,调用postMessage方法发送数据)

<html>

<head>

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">

<title>Test Cross-domain communication using HTML5</title>

<script type="text/JavaScript">

function sendIt(){

// 通过 postMessage 向子窗口发送数据

document.getElementById("otherPage").contentWindow

.postMessage(

document.getElementById("message").value,

"http://10.16.92.34:81"

);

}

</script>

</head>

<body>

<!-- 通过 iframe 嵌入子页面 -->

<iframe src="http://10.16.92.34:81/xampp/other-domain.html"

id="otherPage"></iframe>

<br/><br/>

<input type="text" id="message"><input type="button"

value="Send to child.com" onclick="sendIt()" />

</body>

</html>

step2:B域页面other-domain.html子窗口中监听onmessage事件,显示父窗口发送来的数据

<html>

<head>

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">

<title>Web page from child.com</title>

<script type="text/JavaScript">

//event 参数中有 data 属性,就是父窗口发送过来的数据

window.addEventListener("message", function( event ) {

// 把父窗口发送过来的数据显示在子窗口中

document.getElementById("content").innerHTML+=event.data+"<br/>";

}, false );

</script>

</head>

<body>

Web page from http://10.16.92.34:81

<div id="content"></div>

</body>

</html>

操作参考图:

时间: 2024-10-10 01:38:27

前端跨域杂谈的相关文章

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

前端跨域问题 一:同源策略 1.what's this 所谓同源是指,域名,协议,端口相同.当浏览器运行一个JS脚本时会进行同源检测,如果不同源是不能执行的. 2.源继承 来自about:blank,javascript:和data:URLs中的内容,继承了将其载入的文档所指定的源,因为它们的URL本身未指定任何关于自身源的信息. 3.变更源 变更源可以实现基础域相同的不同页面的跨域问题. 如:a.baidu.com/index.html 通过 iframe 引入 b.baidu.com/ind

解决前端跨域请求的几种方式

利用 JSONP 实现跨域调用 说道跨域调用,可能大家首先想到的或者听说过的就是 JSONP 了. 1.1 什么是JSONP JSONP 是 JSON 的一种使用模式,可以解决主流浏览器的跨域数据访问问题.其原理是根据 XmlHttpRequest 对象受到同源策略的影响,而 <script> 标签元素却不受同源策略影响,可以加载跨域服务器上的脚本,网页可以从其他来源动态产生 JSON 资料.用 JSONP 获取的不是 JSON 数据,而是可以直接运行的 JavaScript 语句. 1.2

前端跨域访问

1. JSONP 2. CORS(Cross-origin resource sharing) 2.1 运行模式 2.2 JQuery支持CORS 2.3 与JSONP相比 3. 跨域访问在点评的应用 References 在互联网应用中: 一个页面需要请求多个域名下的web服务端接口 同时一个web服务接口可能会被很多不同域名下的页面请求. 一个web应用如果支持为了支持以上模式而申请多个域名是不合算的,因为域名申请和管理所占用的资源比较大,因此服务端支持跨域就成了一个更合理的解决方案.解决跨

前端跨域几种方式

跨域问题的直接原因是浏览器存在同源策略,浏览器同源指的是:两个页面的协议.端口和主机相同,则两个页面具有相同的源.IE下满足协议.主机相同,就认为是同源. 想象一下,如果没有同源策略,谁都可以修改你站点上的内容,读取你的cookie,后果难以想象 前端跨域的几种方式 修改document.domain document.domain 用来获取当前网页的域名,document.domain可以被赋值 document.domain只能修改成当前域名的主域名或者基础域名,如当前域名是b.360.cn

前端跨域请求原理及实践

前端跨域请求原理及实践 2017-03-03 前端大全 (点击上方公众号,可快速关注) 作者:高鹏 tingandpeng.com/2016/09/05/前端跨域请求原理及实践/ 如有好文章投稿,请点击 → 这里了解详情 一. 跨域请求的含义 浏览器的同源策略,出于防范跨站脚本的攻击,禁止客户端脚本(如 JavaScript)对不同域的服务进行跨站调用. 一般的,只要网站的 协议名protocol. 主机host. 端口号port 这三个中的任意一个不同,网站间的数据请求与传输便构成了跨域调用.

前端跨域的那些事

这一节,我们来讲一讲,前端跨域的那些事,主要分成这样的几部分来讲解, 一.为什么要跨域? 二.常见的几种跨域与使用场景 2.1 JSONP跨域 2.2 iframe跨域 2.3 window.name 跨域 2.4 document.domain 跨域 2.5 cookie跨域 2.6 postMessage跨域 三.总结 一.为什么要跨域 跨域,通常情况下是说在两个不通过的域名下面无法进行正常的通信,或者说是无法获取其他域名下面的数据,这个主要的原因是,浏览器出于安全问题的考虑,采用了同源策略

.net mvc webapi 解决前端跨域问题

跨域问题的原因不解释了,直接设置两步就可以解决前端跨域问题 1.Gloabel.asax文件中 //解决跨域问题 protected void Application_BeginRequest(object sender, EventArgs e) { RegisterRoutes(RouteTable.Routes); if (HttpContext.Current.Request.HttpMethod == "OPTIONS") { HttpContext.Current.Resp

前端跨域方案-跨域请求代理(asp.net handler)

现在技术开发偏向于使用统一的接口处理浏览器或者app的http请求. 大家都知道因为浏览器的同源策略的原因 js直接请求webapi 接口会有一些问题,即使做好服务器端的配置 同样会有不少的 问题  并且会有浏览器的兼容性 而使用jsonp 又需要服务器端对返回数据做相关处理 所以考虑考虑使用代理来解决前端跨域请求的问题. 代理程序走asp.net的一般处理程序,来实现前端js请求的接受然后转发到api站点. 关键点: 1.使用url参数的方式传送api接口的站点路径 http://test.m

html5的postmessage实现js前端跨域访问及调用解决方案

关于跨域访问,使用JSONP的方法,我前面已经demo过了,具体见http://supercharles888.blog.51cto.com/609344/856886,HTML5提供了一个非常强大的API,叫postMessage,它其实就是以前iframe的进化版本,使用起来极其方便,这里举个实验例子: 我们依旧按照与上文相同的设定,假定我们有2个Domain Domain1: http://localhost:8080  它上面有个应用叫HTMLDomain1,并且有个页面叫sender.