网络上跨域的文章大多一样,这里我写下,巩固下自己的知识,顺便做个记录

什么是跨域

这里简单拿百度的网址做个例子:http://www.baidu.com:80 (默认都是80端口、可省略)

http 协议

www 子域名

baidu 主域名

80 端口号

总结:协议、子域名、主域名、端口,其中一个不一致的都称为跨域

jsonp 跨域

在网页中,我们会使用一些cdn图片、cdn资源,他们和我们的页面都不在一个域内,但是他们却可以使用,聪明的程序员使用src 可引入外部资源,实现了跨域的需求。

在页面中定义js函数,通过script 标签的src引入要请求的接口(这就是jsonp的原理),接口中调用js函数,传入json 数据。我这里写了一个简单的例子

<!DOCTYPE html>
<html>
<head>
<title>jsonp 跨域</title>
</head>
<body> <div id="ajax-wrap">通过ajax请求来改变这里的内容</div> <script type="text/javascript"> // 定义jsonp 函数
function jsonp(json){ setTimeout(function(){
var box = document.getElementById('ajax-wrap');
box.innerHTML = json.code;
},3000);
} // 添加script 标签
function appendScript(url){
var script = document.createElement('script');
script.setAttribute('src',url);
document.body.appendChild(s
cript);
} appendScript('http://test2.com'); </script> </body>
</html>
// 服务器端代码
<?php
echo 'jsonp({
"code": "CA1998",
"price": 1780,
"tickets": 5
})'; ?>

jQuery jsonp 跨域

<!DOCTYPE html>
<html>
<head>
<title>test</title>
</head>
<body> <div id="ajax-wrap">通过ajax请求来改变这里的内容</div> <script type="text/javascript" src="http://cdn.bootcss.com/jquery/1.8.3/jquery.min.js"></script>
<script type="text/javascript"> // 定义jsonp 函数
function jsonpp(json){
var box = document.getElementById('ajax-wrap');
box.innerHTML = json.code;
} jQuery(document).ready(function(){
$.ajax({
type: "get",
url: "http://test2.com",
dataType: "jsonp",
jsonp: "callback",//传递给请求处理程序或页面的,用以获得jsonp回调函数名的参数名(一般默认为:callback)
// jsonpCallback:"jsonpp",//自定义的jsonp回调函数名称,默认为jQuery自动生成的随机函数名,也可以写"?",jQuery会自动为你处理数据,如果这里有写的话,success 可以不用处理
success: function(json){
// console.log(json);
jsonpp(json);
},
error: function(xhr){
console.log(xhr);
}
});
}); </script>
</body>
</html>

有些时候,我们在拿到一些公共接口,使用jsonp方式调用接口时、无法使用,应该是接口没有做jsonp的处理

3,CORS 跨域

CORS 是一个W3C标准,全称跨域资源共享(Cross-origin resource sharing)。最初,是在1995年、由网景公司首先加入浏览器的,主要用于互联网跨域访问的安全。跨域资源共享需要浏览器和服务器同时支持,貌似跟ajax没有什么关系。

当我们的ajax请求是跨域请求时,会在请求头信息中,添加一个origin 字段,告诉服务器这个请求来自哪个源。服务器接收到这个字段后,决定是否同意这次请求

// 指定允许其他域名访问  (这个最重要,参数为* 表示任何域名都可以访问,一版设置为请求头信息中的 origin字段)
header('Access-Control-Allow-Origin: http://test.com');
// 响应类型 ()
header('Access-Control-Allow-Methods:POST');
// 响应头设置
header('Access-Control-Allow-Headers:x-requested-with,content-type');

这里我只写一个简单的例子

<!DOCTYPE html>
<html>
<head>
<title>test</title>
</head>
<body> <div id="ajax-wrap">通过ajax请求来改变这里的内容</div> <script type="text/javascript" src="http://cdn.bootcss.com/jquery/1.8.3/jquery.min.js"></script>
<script type="text/javascript"> jQuery(document).ready(function(){
$.ajax({
type: "get",
url: "http://test2.com?name=xiami",
dataType: "json",
success: function(json){
console.log(json);
},
error: function(xhr){
console.log(xhr);
}
});
}); </script>
</body>
</html>
// php 代码
<?php
// 指定允许其他域名访问
header('Access-Control-Allow-Origin: http://test.com');
// 响应类型
header('Access-Control-Allow-Methods:POST');
// 响应头设置
header('Access-Control-Allow-Headers:x-requested-with,content-type'); echo '{
"code": "CA1998",
"price": ' .$name.',
"tickets": 5
}';

cors兼容 IE10及以上版本, 更多细节,通过下面的参考网址,进行详细查看

参考网址

说说JSON和JSONP,也许你会豁然开朗

XHR2 了解

浏览器同源策略及规避方法

跨域资源共享 CORS 详解

HTTP访问控制(CORS)

ajax 跨域的几种方式的更多相关文章

  1. ajax处理跨域有几种方式

    一.什么是跨域 同源策略是由Netscape提出的著名安全策略,是浏览器最核心.基本的安全功能,它限制了一个源(origin)中加载文本或者脚本与来自其他源(origin)中资源的交互方式,所谓的同源 ...

  2. php跨域的几种方式

    PHP实现跨域的几种形式 1.JSONP(JSON with padding)原理 利用html里面script标签可以加载其他域下的js这一特性,使用script src的形式来获取其他域下的数据, ...

  3. JQuery的Ajax跨域请求的解决方式

            今天在项目中须要做远程数据载入并渲染页面,直到开发阶段才意识到ajax跨域请求的问题,隐约记得Jquery有提过一个ajax跨域请求的解决方式,于是即刻翻出Jquery的API出来研究 ...

  4. Ajax跨域的几种方法以及每种方法的原理

    js中几种实用的跨域方法原理详解 这里说的js跨域是指通过js在不同的域之间进行数据传输或通信,比如用ajax向一个不同的域请求数据,或者通过js获取页面中不同域的框架中(iframe)的数据.只要协 ...

  5. 深入浅出:了解jsonp跨域的九种方式

    什么是“”跨域”: 跨域访问,简单来说就是 A 网站的 javascript 代码试图访问 B 网站,包括提交内容和获取内容.由于安全原因,跨域访问是被各大浏览器所默认禁止的.当一个域与其他域建立了信 ...

  6. SpringBoot 中实现跨域的几种方式

    一.为什么会出现跨域问题 出于浏览器的同源策略限制.同源策略(Sameoriginpolicy)是一种约定,它是浏览器最核心也最基本的安全功能,如果缺少了同源策略,则浏览器的正常功能可能都会受到影响. ...

  7. Ajax 跨域的几种解决方案

    作者:黄轩链接:http://www.zhihu.com/question/19618769/answer/38934786来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处 ...

  8. 跨域的几种方式以及call(),apply() bind()方法的作用和区别

    jsonp: jsonp 全称是JSON with Padding,是为了解决跨域请求资源而产生的解决方案,是一种依靠开发人员创造出的一种非官方跨域数据交互协议. 一个是描述信息的格式,一个是信息传递 ...

  9. Springboot设置跨域的三种方式

    方式一(精细配置) 在需要跨域的整个Controller或者单个方法上添加@CrossOrigin注解 方式二(全局配置) @Configuration public class WebMvcConf ...

随机推荐

  1. good bye 2015 B - New Year and Old Property

    题意:统计在n,m之间的数的二进制表示形式只有一个零的数目. 位运算模拟+dfs #include<iostream> #include<string> #include< ...

  2. javascript设计模式7

    链式调用 (function(){ function _$(els){ //... } _$.prototype={ each:function(fn){ for(var i=0,len=this.e ...

  3. 拉格朗日对偶(Lagrange duality)

    拉格朗日对偶(Lagrange duality) 存在等式约束的极值问题求法,比如下面的最优化问题:              目标函数是f(w),下面是等式约束.通常解法是引入拉格朗日算子,这里使用 ...

  4. thinking in java Generics Latent typing

    The beginning of this chapter introduced the idea of writing code that can be applied as generally a ...

  5. .Net 项目常见疑难杂症

    1.A项目引用 B项目 B项目引用C.dll 同时 A也必须引用 C.dll 则 A中引用的C的版本 必须和 B中引用C的版本相同 否则就会出现下面这类问题:解决办法 :同步A B项目中引用C的版本一 ...

  6. 【Stage3D学习笔记续】山寨Starling(八):核心优化(批处理)的实现

    批处理是使GPU进行高效绘制的一种技术手段,也是整个渲染流程中最核心的技术,到目前为止我们并没有使用到这种技术手段,下面我们看看我们现在的渲染机制. 先想一想我们最开始是怎么向GPU绘制一幅图像的,可 ...

  7. Linux安装JDK详细步骤

    Linux安装JDK步骤 1.先从网上下载jdk(jdk-7u1-linux-i586.rpm),下载地址:http://www.oracle.com/technetwork/java/javase/ ...

  8. innobackupex 单脚本循环7天一全备6增备脚本更新

    #!/bin/bash #日期转为天数 function date2days { echo "$*" | awk '{ z=-$)/); y=$+-z; m=$+*z-; j=*m ...

  9. linux下hexdump和od命令:显示文件十六进制格式

    Linux指令: od 示例用法:  od -c hello Linux指令:      od od命令用户通常使用od命令查看特殊格式的文件内容.通过指定该命令的不同选项可以以十进制.八进制.十六进 ...

  10. Chart控件的多种使用方法

    花了近一周时间专门研究.net 3.5平台提供的Chart控件的使用方法,感觉该控件的功能很强大,做出的图表效果也很美观,使用方法也并不复杂.如今先讲下Chart控件的部署及一些基本使用方法. 一.安 ...