views.py
def get_data(request): return HttpResponse("机密数据") urls.py
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^(?P<version>\w+)/users/$', views.UsersView.as_view(),name='xxxx'),
url(r'^index/',views.IndexView.as_view()),
url(r'^get_data.html$', views.get_data),
] In [2]: import requests In [3]: res=requests.get('http://127.0.0.1:8001/get_data.html') In [4]: res
Out[4]: <Response [200]> In [5]: res.text
Out[5]: '机密数据' 通过发送requests请求时无限制
通过axios ajax 浏览器会限制返回
Failed to load http://127.0.0.1:8001/get_data.html:
No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://localhost:8080' is therefore not allowed access.
绕过浏览器的同源策略 即只能在当前域发请求,跨域就被浏览器限制
ajax受同源策略限制 但是有src属性的标签不受同源策略
img,script,iframe[伪造ajax请求],
<iframe src="http://www.autohome.com.cn" style="weight:'1000px';height:'2000px'"></iframe>
<head>
<meta charset="UTF-8">
<title>Title</title>
<script src="http://127.0.0.1:8001/get_data.html"></script>
</head>
但是会提示错误
get_data.html:1 Uncaught ReferenceError: 机密数据 is not defined
at get_data.html:1 1修改服务端
def get_data(request): return HttpResponse("alert(1)")
结果
客户端成功执行alert(1)
可以拿到数据但是没法使用 2.jsonp方式
手动版
客户端:先定义函数
服务端func('数据')
服务器端views code
def get_data(request): return HttpResponse("func('机密数据')") 客户端index.html
<head>
<meta charset="UTF-8">
<title>Title</title> <script>
function func (arg) {
console.log(arg)
}
</script>
<script src="http://127.0.0.1:8001/get_data.html"></script> </head>
可以拿到数据 手动实现jsonp
函数名由客户端决定
服务端
def get_data(request):
func_name=request.GET.get("callback")
return HttpResponse("%s('机密数据')" %func_name)
客户端 <html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<h1>测试跨域</h1>
<input type="button" onclick="jsonp('http://127.0.0.1:8001/get_data.html?callback=func')" value="发送jsonp请求"/>
<body>
<script src="../static/jquery-3.2.1.js"></script>
<script>
function func(arg) {
alert(arg);
document.head.removeChild(tag);
} function jsonp(url) {
tag= document.createElement('script')
tag.src=url;
document.head.appendChild(tag); }
</script>
</body>
</html> 3jquey默认支持jsonp
本质就是动态创建script标签
返回函数名 服务端自动包裹数据
客户端
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<h1>测试跨域</h1>
<input type="button" onclick="Jsonp2()" value="发送jsonp2请求"/>
<body>
<script src="{% static 'jquery-3.2.1.js' %}"></script>
<script>
function test(arg) { }
function Jsonp2() {
$.ajax({
url:"http://127.0.0.1:8001/get_data.html",
type:"GET",
dataType:'JSONP',
{# callback:test#}
success:function (data) {
console.log(data);
}
})
}
</script>
</body>
</html> 4客户端调整
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<h1>测试跨域</h1>
{#<input type="button" onclick="jsonp('http://127.0.0.1:8001/get_data.html?callback=func')" value="发送jsonp请求"/>#}
<input type="button" onclick="Jsonp2()" value="发送jsonp2请求"/>
<input type="button" onclick="Jsonp3()" value="发送jsonp3请求"/>
<body>
<script src="{% static 'jquery-3.2.1.js' %}"></script>
<script>
function list(arg) {
console.log(arg)
}
function Jsonp3() {
$.ajax({
url:"http://www.jxntv.cn/data/jmd-jxtv2.html",
{# http://www.jxntv.cn/data/jmd-jxtv2.html?callback=list#}
type:"GET",
dataType:'JSONP',
jsonp:'callback',
jsonpCallback:'list'
})
} </script>
</body>
</html>

  

jsonp实现跨域请求的本质demo[无法发送post请求]的更多相关文章

  1. 关于使用Jsonp做跨域请求

    今天在使用Jsonp做跨域请求的练习时碰上这样一个问题 代码如下 <!DOCTYPE html> <html> <head> <meta charset=&q ...

  2. 使用jsonp进行跨域请求

    使用jsonp进行跨域请求 在实际的业务中很多时候需要用到跨域请求,然而jsonp为我们提供了一种非常方便的跨域请求的方式,具体实现代码如下: $.ajax({ type:"get" ...

  3. jsonp原理,跨域请求头处理

    一.jsonp(解决跨域)思路介绍: 因浏览器的同源策略不会拦截link标签内的src请求,所以利用这一点,我们把后端开放的接口路径放在src内, 其在发送请求后会自动接收返回的东西,所以我们可以给要 ...

  4. 跨域解决方案二:使用JSONP实现跨域

    跨域的实现方式有多种,除了 上篇文章 提到的CORS外,常见的还有JSONP.HTML5.Flash.iframe.xhr2等. 这篇文章对JSONP的跨域原理进行了探索,并将我的心得记录在这里和大家 ...

  5. 转(JSONP处理跨域事件)

     前言: 由于Sencha Touch 2这种开发模式的特性,基本决定了它原生的数据交互行为几乎只能通过AJAX来实现. 当然了,通过调用强大的PhoneGap插件然后打包,你可以实现100%的Soc ...

  6. 使用JSONP实现跨域

    什么是跨域? 简单的来说,出于安全方面的考虑,页面中的JavaScript无法访问其他服务器上的数据,即"同源策略".而跨域就是通过某些手段来绕过同源策略限制,实现不同服务器之间通 ...

  7. JSONP解决跨域问题,什么是JSONP(转)

    原文链接:https://www.cnblogs.com/xinxingyu/p/6075881.html 说到AJAX就会不可避免的面临两个问题,第一个是AJAX以何种格式来交换数据?第二个是跨域的 ...

  8. 用jsonp 解决跨域问题

    想自己用 js写一个原生的ajax请求,访问本地文件,json/txt.但是demo,写了一个后,发现 原来是跨域了. js 写的原生ajax 请求代码如下 html代码 将获取的txt 文件 展示出 ...

  9. jsonp 实现跨域

    为什么会出现跨域问题 跨域的安全限制都是对浏览器端来说的,服务器端是不存在跨域安全限制的. 浏览器的同源策略限制从一个源加载的文档或脚本与来自另一个源的资源进行交互. 如果协议,端口和主机对于两个页面 ...

随机推荐

  1. Nhibernate系列学习之(二) 简单增删改查

    实例中解决方案简单的创建三层架构,符合开发过程中最简单的运用: 1:首先在数据库中创建一个表T_School,脚本如下: USE [TestDb] GO /****** 对象: Table [dbo] ...

  2. 【转】Python获取当前系统时间

    转自:https://www.cnblogs.com/-ldzwzj-1991/p/5889629.html 取得时间相关的信息的话,要用到python time模块,python time模块里面有 ...

  3. NOIP模拟题 栅栏

    题目大意 给定一个$n\times m$的网格图,每次会选择一块矩形沿着网格线铺上栅栏,或者拆除之前铺的栅栏,或者询问两个格子能否不经过栅栏直接到达. 保证栅栏没有重叠或交叉,删去的栅栏删除前一定存在 ...

  4. bzoj3597 方伯伯运椰子

    有一个 DAG,有一个源点,一个汇点和很多条边,每条边有花费 $d_i$ 和最大流量 $c_i$,可以花 $b_i$ 的钱把最大流量增加 $1$,花 $a_i$ 的钱把最大流量减少 $1$ 现在要进行 ...

  5. GC(Garbage Collection)垃圾回收机制

    1.在垃圾回收器中,程序员没有执行权,只有通知它的权利. 2.程序员可以通过System.gc().通知GC运行,但是Java规范并不能保证立刻运行. 3.finalize()方法,是java提供给程 ...

  6. AtCoder Beginner Contest 087 D - People on a Line

    Time limit : 2sec / Memory limit : 256MB Score : 400 points Problem Statement There are N people sta ...

  7. BZOJ5302: [Haoi2018]奇怪的背包

    BZOJ5302: [Haoi2018]奇怪的背包 https://lydsy.com/JudgeOnline/problem.php?id=5302 分析: 方程\(\sum\limits_{i=1 ...

  8. 一步一步使用webpack+react+scss脚手架重构项目

    前几天做了一个项目:[node]记录项目的开始与完成——pipeline_kafka流式数据库管理项目:因为开发时间紧迫,浅略的使用了一下react,感觉这个ui库非常的符合我的口味,现在趁着有空闲时 ...

  9. FastAdmin 的 Bootstrap-Table 如何合并字段?

    FastAdmin 的 Bootstrap-Table 如何合并字段? ★hey-成都 14:13:34 把下面那个字段合并到上面那个字段是用什么方法 ^★暗物质-江西 14:17:21 city加上 ...

  10. 在C#中实现截获shell程序的输出

    在Windows环境下的所谓shell程序就是dos命令行程序,比如VC的CL.exe命令行编译器,JDK的javac编译器,启动java程序用的java.exe都是标准的shell程序.截获一个sh ...