Ajax的问题(跨域)
ajax往自己的域名访问是可以,如果向别的域名访问就会报错。 JSONPjsonp 就是钻空子,浏览器虽然禁止ajax跨域,但是允许script(src)的代码不禁止,可以把这个用jquery CDN的方法
https://www.cnblogs.com/xiaohuochai/p/6568039.html 跨站练习环境设置启动两个项目一个端口为8001,一个为8000,端口8001提供数据。通过8000端口的程序来获取8001提供的数据 8001的代码from django.shortcuts import render,HttpResponse import json def user_jsonp(request): print('请求来了。。。') user_list=[ 'zhang','wang','li','zhao' ] temp = json.dumps(user_list) return HttpResponse(temp) 8000的代码def user(request): return render(request,'user.html') <body> <input type="button" value="获取信息" onclick="showdata();"> <div> <ul id="user_list"> </ul> </div> <script> function showdata() { xhr = new XMLHttpRequest(); xhr.onreadystatechange=function () { if(xhr.readyState==4){ var content = xhr.responseText; console.log(content) } } xhr.open('GET','http://127.0.0.1:8001/user_jsonp/'); xhr.send() } </script> </body> 这个时候两个项目启动起来后,8000页面点击获取来获取8001的数据时候是出错的(浏览器的同源策略)报错如下: function showdata() { var tag = document.createElement('script'); tag.src='http://127.0.0.1/8001/user_jsonp/'; document.head.appendChild(tag) } 这里通过scirpt的方式已经跨过站了,数据已经存储到了内存中,下面我们如何从内存里面拿到8001的值那?如果这里有一个变量的换,我们是可以通过变量来获取的 ,通过这个思路,出现了下面的这个代码 from django.shortcuts import render,HttpResponse import json def user_jsonp(request): v = request.GET.get('funname') print('请求来了。。。') user_list=[ 'zhang','zhao' ] # temp = json.dumps(user_list) user_list_str = json.dumps(user_list) temp = "%s(%s)"%(v,user_list_str) return HttpResponse(temp) 8000前端获取的8001的返回后,做如下处理 function showdata() { var tag = document.createElement('script'); tag.src='http://127.0.0.1/8001/user_jsonp/?funname=bbb'; document.head.appendChild(tag)#这里返回的是一个bbb(xx),然后bbb就会执行下面的bbb函数 } function bbb(arg) { console.log(arg) } 现在大家默认函数会是callback 通过ajax 实现jsonp的方式
cros跨站
cros 就是服务端返回的字符串带着一个字段,告诉浏览器不要阻止。 简单请求: def new_users(request): obj = HttpResponse('返回内容') obj['Access-Control-Allow-Origin'] = "*" return obj 复杂请求: def new_users(request): if request.method == "OPTIONS": obj = HttpResponse() obj['Access-Control-Allow-Origin'] = "*" obj['Access-Control-Allow-Methods'] = "DELETE" return obj obj = HttpResponse('asdfasdf') obj['Access-Control-Allow-Origin'] = "*" return obj 其他: - 任何请求 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |