重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
ajax往自己的域名访问是可以,如果向别的域名访问就会报错。
这一版是请求发过去了,服务器也给返回数据了,但是浏览器会给报错(浏览器遵:同源策略)。他的这个策略把ajax跨域发送请求时,再回来时候浏览器阻止了。
成都创新互联公司专注为客户提供全方位的互联网综合服务,包含不限于成都做网站、网站建设、外贸营销网站建设、互助网络推广、微信平台小程序开发、互助网络营销、互助企业策划、互助品牌公关、搜索引擎seo、人物专访、企业宣传片、企业代运营等,从售前售中售后,我们都将竭诚为您服务,您的肯定,是我们最大的嘉奖;成都创新互联公司为所有大学生创业者提供互助建站搭建服务,24小时服务热线:028-86922220,官方网址:www.cdcxhl.com
jsonp 就是钻空子,浏览器虽然禁止ajax跨域,但是允许script(src)的代码不禁止,可以把这个用jquery cdn的方法
使用方法:
https://www.cnblogs.com/xiaohuochai/p/6568039.html
这个博客写的非常好
启动两个项目一个端口为8001,一个为8000,端口8001提供数据。通过8000端口的程序来获取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)
def user(request):
return render(request,'user.html')
这个时候两个项目启动起来后,8000页面点击获取来获取8001的数据时候是出错的(浏览器的同源策略)报错如下:(index):1 Failed to load http://127.0.0.1:8001/user_jsonp/: No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://127.0.0.1:8000' is therefore not allowed access.
这个就是同源策略阻止了ajax的访问。为了解决这个问题,我们可以送script的js的方式来解决
如下面的代码:
function showdata() {
var tag = document.createElement('script');
tag.src='http://127.0.0.1/8001/user_jsonp/';
document.head.appendChild(tag)
}
这里通过scirpt的方式已经跨过站了,数据已经存储到了内存中,下面我们如何从内存里面拿到8001的值那?如果这里有一个变量的换,我们是可以通过变量来获取的 ,通过这个思路,出现了下面的这个代码
数据端8001这边在返回的时候返回一个fun(xxx)这么类型的一个字段,前端来获取这个
8001代码:
from django.shortcuts import render,HttpResponse
import json
def user_jsonp(request):
v = request.GET.get('funname')
print('请求来了。。。')
user_list=[
'zhang','wang','li','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
jsonp只能通过get方式,你写了post,内部还是get请求。而且是双方约定的
http://www.cnblogs.com/wupeiqi/articles/5703697.html
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
其他:
- 任何请求