查看: 2629|回复: 0

[DIV/CSS] Ajax的问题(跨域)

发表于 2018-4-6 08:00:00

ajax往自己的域名访问是可以,如果向别的域名访问就会报错。
这一版是请求发过去了,服务器也给返回数据了,但是浏览器会给报错(浏览器遵:同源策略)。他的这个策略把ajax跨域发送请求时,再回来时候浏览器阻止了。

JSONP

jsonp 就是钻空子,浏览器虽然禁止ajax跨域,但是允许script(src)的代码不禁止,可以把这个用jquery CDN的方法
使用方法:

发送:--->>在自己的页面创建一个script标签,让它的src=‘http://baidu.com/?p=1’这样钻过去

https://www.cnblogs.com/xiaohuochai/p/6568039.html
这个博客写的非常好

跨站练习 环境设置

启动两个项目一个端口为8001,一个为8000,端口8001提供数据。通过8000端口的程序来获取8001提供的数据

8001的代码
  1. from django.shortcuts import render,HttpResponse
  2. import json
  3. def user_jsonp(request):
  4. print('请求来了。。。')
  5. user_list=[
  6. 'zhang','wang','li','zhao'
  7. ]
  8. temp = json.dumps(user_list)
  9. return HttpResponse(temp)
复制代码
8000的代码
  1. def user(request):
  2. return render(request,'user.html')
复制代码
  1. <body>
  2. <input type="button" value="获取信息" onclick="showdata();">
  3. <div>
  4. <ul id="user_list">
  5. </ul>
  6. </div>
  7. <script>
  8. function showdata() {
  9. xhr = new XMLHttpRequest();
  10. xhr.onreadystatechange=function () {
  11. if(xhr.readyState==4){
  12. var content = xhr.responseText;
  13. console.log(content)
  14. }
  15. }
  16. xhr.open('GET','http://127.0.0.1:8001/user_jsonp/');
  17. xhr.send()
  18. }
  19. </script>
  20. </body>
复制代码

这个时候两个项目启动起来后,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的方式来解决
如下面的代码:

  1. function showdata() {
  2. var tag = document.createElement('script');
  3. tag.src='http://127.0.0.1/8001/user_jsonp/';
  4. document.head.appendChild(tag)
  5. }
复制代码

这里通过scirpt的方式已经跨过站了,数据已经存储到了内存中,下面我们如何从内存里面拿到8001的值那?如果这里有一个变量的换,我们是可以通过变量来获取的 ,通过这个思路,出现了下面的这个代码
数据端8001这边在返回的时候返回一个fun(xxx)这么类型的一个字段,前端来获取这个
8001代码:

  1. from django.shortcuts import render,HttpResponse
  2. import json
  3. def user_jsonp(request):
  4. v = request.GET.get('funname')
  5. print('请求来了。。。')
  6. user_list=[
  7. 'zhang','wang','li','zhao'
  8. ]
  9. # temp = json.dumps(user_list)
  10. user_list_str = json.dumps(user_list)
  11. temp = "%s(%s)"%(v,user_list_str)
  12. return HttpResponse(temp)
复制代码

8000前端获取的8001的返回后,做如下处理

  1. function showdata() {
  2. var tag = document.createElement('script');
  3. tag.src='http://127.0.0.1/8001/user_jsonp/?funname=bbb';
  4. document.head.appendChild(tag)#这里返回的是一个bbb(xx),然后bbb就会执行下面的bbb函数
  5. }
  6. function bbb(arg) {
  7. console.log(arg)
  8. }
复制代码

现在大家默认函数会是callback

通过ajax 实现jsonp的方式

Ajax的问题(跨域)

jsonp只能通过get方式,你写了post,内部还是get请求。而且是双方约定的

cros跨站

http://www.cnblogs.com/wupeiqi/articles/5703697.html

cros 就是服务端返回的字符串带着一个字段,告诉浏览器不要阻止。

  1. 简单请求:
  2. def new_users(request):
  3. obj = HttpResponse('返回内容')
  4. obj['Access-Control-Allow-Origin'] = "*"
  5. return obj
  6. 复杂请求:
  7. def new_users(request):
  8. if request.method == "OPTIONS":
  9. obj = HttpResponse()
  10. obj['Access-Control-Allow-Origin'] = "*"
  11. obj['Access-Control-Allow-Methods'] = "DELETE"
  12. return obj
  13. obj = HttpResponse('asdfasdf')
  14. obj['Access-Control-Allow-Origin'] = "*"
  15. return obj
  16. 其他:
  17. - 任何请求
复制代码


回复

使用道具 举报