jsonp现实跨域Ajax CORS
浏览器有一个很重要的概念——同源策略(Same-Origin Policy)。所谓同源是指,域名,协议,端口相同。不同源的客户端脚本(javascript、ActionScript)在没明确授权的情况下,不能读写对方的资源。但是服务器是返回资源和获取到客服端的数据,只是浏览器阻止了
XMLHttpRequest遵循同源策略,我们默认发送的请求都是同XMLHttpRequest对象发送的.
如下同源策略起作用:

JSONP就像是JSON+Padding一样(Padding这里我们理解为填充)
(JSON with Padding)是JSON的一种“使用模式”,可用于解决主流浏览器的跨域数据访问的问题。由于同源策略,一般来说位于 server1.example.com 的网页无法与不是 server1.example.com的服务器沟通,而 HTML 的<script> 元素是一个例外。利用 <script> 元素的这个开放策略,网页可以得到从其他来源动态产生的 JSON 资料,而这种使用模式就是所谓的 JSONP。用 JSONP 抓到的资料并不是 JSON,而是任意的JavaScript,用 JavaScript 直译器执行而不是用 JSON 解析器解析。
注意:script img a iframe标签是允许的跨域请求的,不遵循同源策略
Jsonp原理利用script标签获取外部地址数据,获取远程数据的时候,返回后的数据必须要包裹一个script函数名,在本地script执行的时候,执行服务器返回的函数结个:
1 获取数据
Veiw代码:
def jsopdata(request):
return HttpResponse("数据返回成功")
#return HttpResponse('func("数据返回成功")') Html代码:
<div id="content"></div>
<input type="button" value="测试3" onclick="jsonp3()">
<script>
function jsonp3() {
var tag = document.createElement("script");
tag.src = "http://www.a.com/jsopdata/";
document.head.appendChild(tag); //增加一个标签;放到head里面
document.head.removeChild(tag); //删除一个标签
} //利用script标签打破浏览器的同源策略;这样能货到数据了
<script/>
script标签获取到服务器数据,但因为是script标签里面的内容,所有显示如下错误,我们需要遵循script语法

2 修改script代码 和 view代码
veiw代码
def jsopdata(request):
# return HttpResponse("数据返回成功")
return HttpResponse('func("数据返回成功")')
Html代码:
<div id="content"></div>
<input type="button" value="测试3" onclick="jsonp3()">
<script>
function jsonp3() {
var tag = document.createElement("script");
tag.src = "http://www.a.com/jsopdata/";
document.head.appendChild(tag); //增加一个标签;放到head里面
document.head.removeChild(tag); //删除一个标签
} //利用script标签打破浏览器的同源策略;这样能货到数据了
function func(arg) { //执行服务器返回的函数
console.log(arg);
$("#content").html(arg) //arg是服务器返回函数的内容
}
<script/>

3 通过jQuery中的Ajax方式访问:
View代码:
def jsopdata(request):
# return HttpResponse("数据返回成功")
return HttpResponse('func("数据返回成功")')
html代码
<div id="content"></div>
<input type="button" value="测试1" onclick="jsonp1()">
<input type="button" value="测试2" onclick="jsonp2()">
<script>
function jsonp2() {
$.ajax({
url:"http://www.a.com/jsopdata/",
type:"GET", //只能用GET方式,如果改成其他的方式Jsonp会给你修改成GET方式
dataType:"jsonp", //使用jsonp方式;也就是说指定jsonp方式后,不在使用XMLHttpRequst对像发送请求,而是按照上面内容写的,通过创建scritp标签来获取内容,然后删掉刚创建script标签
data:{'id':2},
success:function (arg) {
$("#content").html(arg)
}
function func(arg) { //这函数写死了,也就是说服务器端必须返回带有这个函数名和数据的内容,才能执行.需要写活这块看下面
console.log(arg);
$("#content").html(arg)
}
<scprit />
4 需要写活服务端的返回的函数
view代码:
def jsopdata(request):
f = request.GET.get("callback")
print(f)
# return HttpResponse("数据返回成功")
return HttpResponse('%s("数据返回成功")' %(f))
html代码:
<div id="content"></div>
<input type="button" value="测试1" onclick="jsonp1()">
<input type="button" value="测试2" onclick="jsonp2()">
function jsonp2() {
$.ajax({
url:"http://www.a.com/jsopdata/", //这里面不需要直接写callback=func;不然返回数据会有问题.
type:"GET",
dataType:"jsonp",
data:{'id':2},
jsonp:"callback", //相当于等于http://www.a.com/jsopdata/?callback (键)
jsonpCallback:'func', //相当于等于http://www.a.com/jsopdata/?callback=func (值)如果不写会随机生成字符串发送
success:function (arg) { //success:function func(arg)结果一样
$("#content").html(arg)
}
})
}
CORS:
发送时候浏览器提示:
已拦截跨源请求:同源策略禁止读取位于http://127.0.0.1:8000/server/的远程资源。(原因:CORS 头缺少 'Access-Control-Allow-Origin')
def index(request):
repsone = render(request,"index.html")
repsone['Access-Control-Allow-Origin'] = 'http://127.0.0.1:8000' #允许这个地址请求通过即可 也可以加*允许所有,列表也可以加
return repsone
$("#run").click(function () {
alert(123);
$.ajax({
url:'http://127.0.0.1:8000/server/',
type:"get",
success:function (data) {
console.log(data)
}
})
})
jsonp现实跨域Ajax CORS的更多相关文章
- 使用JSONP进行跨域Ajax 调用
JSONP 是啥 JSONP 全称是JSON with Padding. 当需要进行跨域Ajax 调用的时候, 需要用到JSONP 协议. 客户端 $.ajax({ url: 'http://xxx' ...
- 在django中解决跨域AJAX
由于浏览器存在同源策略机制,同源策略阻止从一个源加载的文档或脚本获取另一个源加载的文档的属性. 特别的:由于同源策略是浏览器的限制,所以请求的发送和响应是可以进行,只不过浏览器不接收罢了. 浏览器同源 ...
- 跨域Ajax -- jsonp和cors
跨域Ajax - jsonp - cors 参考博客: http://www.cnblogs.com/wupeiqi/articles/5703697.html http://www.cnblogs. ...
- AJAX POST&跨域 解决方案 - CORS
一晃又到新年了,于是开始着手好好整理下自己的文档,顺便把一些自认为有意义的放在博客上,记录成点的点滴. 跨域是我在日常面试中经常会问到的问题,这词在前端界出现的频率不低,主要原因还是 ...
- AJAX POST&跨域 解决方案 - CORS(转载)
跨域是我在日常面试中经常会问到的问题,这词在前端界出现的频率不低,主要原因还是由于安全限制(同源策略, 即JavaScript或Cookie只能访问同域下的内容),因为我们在日常的项目开发时会不可避免 ...
- 跨域资源共享CORS与JSONP
同源策略限制: 同源策略(Same origin policy)是一种约定,它是浏览器最核心也最基本的安全功能,如果没有同源策略,攻击者可以通过JavaScript获取你的邮件以及其他敏感信息,比如说 ...
- (转) AJAX POST&跨域 解决方案 - CORS
跨域是我在日常面试中经常会问到的问题,这词在前端界出现的频率不低,主要原因还是由于安全限制(同源策略, 即JavaScript或Cookie只能访问同域下的内容),因为我们在日常的项目开发时会不可避免 ...
- CORS,jsonp解决跨域问题
同源和跨域 同源策略(Same origin policy)是一种约定,它是浏览器最核心也最基本的安全功能,如果缺少了同源策略,则浏览器的正常功能可能都会受到影响.可以说Web是构建在同源策略基础之上 ...
- AJAX跨域问题解决方法(2)——JSONP解决跨域
JSONP是什么?JSON全称为JSON with Padding,是JSON的一种补充的使用方式,不是官方协议. 使用JSONP服务器后台要改动吗?JSONP不同于一般的ajax请求返回json对象 ...
随机推荐
- cifX使用心得
一.注意事项: 1.xChannelIORead()第一次读取到数据是空的.2.系统安装cifX驱动之前一定先安装有uio模块和libpciaccess库:建议系统内核为3.X.X版本,测试版本为3. ...
- C#知识点汇总
核心技术课程 编程基础强化练习.面向过程编程(变量.if.for.while.函数.类型转换.枚举 .数组.重载.值类型.引用类型.ref.out.字符串).面向对象编程(类.继承 .接口.异常.索引 ...
- 如何查看电脑已连接的WiFi密码
控制面板->网络和Internet->网络和共享中心 点击已连接的WLAN网络,查看“WLAN状态”->无线属性->安全 在显示字符下可以看到已连接wifi的密码
- python selenium Chrome模拟手机浏览器(十七)
在做移动端页面测试时可以利用Chrome mobile emulation 辅助完成页面的适配问题,但是目前手机市场上的型号居多我们也没有办法通过人工的模式一一的去适配,所以这里考虑到通过自动化的模式 ...
- 华为4K机顶盒EC6108V9U从原联通更换为电信的IPTV账号成功经验
4K设备直接在淘宝上买30块钱升级4K机顶盒,i视视手机app控制电视和手机投屏 硬件设备:EC6108V9U由X省联通更换为四川电信 采坑经验: 1.要从现有的机顶盒获取mac地址.stbid.ip ...
- eclipse项目上传服务器注意事项
1.先准备服务器环境 2 数据库导入,tomcat安装 3 开放服务器端口,配置网络 4.修改本地代码修改为发布版本,即ip,账号密码数据库等 5 变动的信息应该写在配置文件或者一个全局产量中,这样才 ...
- 工控随笔_07_西门子_WinCC利用命令行实现操作log日志
在WinCC中可以通过报警纪录来实现操作员纪录,这个需要WinCC的消息系统进行组态和配置. 利用消息系统进行实现上诉功能不但复杂而且时间久啦也不方便查询.那么有没有一种简单的方法来 实现操作员纪录呢 ...
- python基本语法汇总
From: https://www.cnblogs.com/yunguoxiaoqiao/p/7640040.html 1.常用列表的操作 D = {} D = {'spam': 2, 'tol': ...
- @Transactional的正确打开方式
经常用到事务管理,可还是不小心会写错,导致事务没有生效,这里总结下. 正确的代码例子如下所示,框架是使用spring+mybatis的,有些配置的就不贴出来了. TestController2: pa ...
- Kong(V1.0.2) Clustering Reference
介绍 Kong集群允许您通过添加更多的机器来处理更多的传入请求来水平扩展系统.它们将共享相同的配置,因为它们指向相同的数据库.指向相同数据存储的Kong节点将是相同Kong集群的一部分. 您需要在Ko ...