分享web开发知识

注册/登录|最近发布|今日推荐

主页 IT知识网页技术软件开发前端开发代码编程运营维护技术分享教程案例
当前位置:首页 > 代码编程

Jsonp实现跨域访问

发布时间:2023-09-06 01:44责任编辑:白小东关键词:跨域

同源策略

同源策略(Same origin policy)是一种约定,它是浏览器最核心也最基本的安全功能,如果缺少了同源策略,则浏览器的正常功能可能都会受到影响。可以说Web是构建在同源策略基础之上的,浏览器只是针对同源策略的一种实现。

同源策略,它是由Netscape提出的一个著名的安全策略。现在所有支持JavaScript 的浏览器都会使用这个策略。所谓同源是指,域名,协议,端口相同。当一个浏览器的两个tab页中分别打开来 百度和谷歌的页面当浏览器的百度tab页执行一个脚本的时候会检查这个脚本是属于哪个页面的,即检查是否同源,只有和百度同源的脚本才会被执行。如果非同源,那么在请求数据时,浏览器会在控制台中报一个异常,提示拒绝访问。
示例
项目A:
==================================http://127.0.0.1:8001项目的index<!DOCTYPE html><html lang="en"><head> ???<meta charset="UTF-8"> ???<title>Title</title> ???<script src="http://code.jquery.com/jquery-latest.js"></script></head><body><button>ajax</button>{% csrf_token %}<script> ???$("button").click(function(){ ???????$.ajax({ ???????????url:"http://127.0.0.1:8002/SendAjax/", ???????????type:"POST", ???????????data:{"username":"bender","csrfmiddlewaretoken":$("[name=‘csrfmiddlewaretoken‘]").val()}, ???????????success:function(data){ ???????????????alert(data) ???????????} ???????}) ???})</script></body></html>==================================http://127.0.0.1:8001项目的viewsdef index(request): ???return render(request,"index.html")def ajax(request): ???import json ???print(request.POST) ???return HttpResponse(json.dumps("hello"))

 项目B: 

==================================http://127.0.0.1:8002项目的index<!DOCTYPE html><html lang="en"><head> ???<meta charset="UTF-8"> ???<title>Title</title> ???<script src="http://code.jquery.com/jquery-latest.js"></script></head><body><button>sendAjax</button>{% csrf_token %}<script> ???$("button").click(function(){ ???????$.ajax({ ???????????url:"/SendAjax/", ???????????type:"POST", ???????????data:{"username":"bender","csrfmiddlewaretoken":$("[name=‘csrfmiddlewaretoken‘]").val()}, ???????????success:function(data){ ???????????????alert(data) ???????????} ???????}) ???})</script></body></html>==================================http://127.0.0.1:8002项目的viewsdef index(request): ???return render(request,"index.html")from django.views.decorators.csrf import csrf_exempt@csrf_exemptdef SendAjax(request): ???import json ???return HttpResponse(json.dumps("hello2"))

 当点击项目1的按钮时,发送了请求,但是会发现报错如下:

已拦截跨源请求:同源策略禁止读取位于 http://127.0.0.1:8002/SendAjax/ 的远程资源。(原因:CORS 头缺少 ‘Access-Control-Allow-Origin‘)。

但是注意,项目2中的访问已经发生了,说明是浏览器对非同源请求返回的结果做了拦截。

Jsonp

 借助script标签,实现跨域请求:

# =============================http://127.0.0.1:8001/index<button>ajax</button>{% csrf_token %}<script> ???function func(name){ ???????alert(name) ???}</script><script src="http://127.0.0.1:8002/SendAjax/"></script># =============================http://127.0.0.1:8002/from django.views.decorators.csrf import csrf_exempt@csrf_exemptdef SendAjax(request): ???import json ???print("++++++++") ???# dic={"k1":"v1"} ???return HttpResponse("func(‘yuan‘)") ?# return HttpResponse("func(‘%s‘)"%json.dumps(dic))

这其实就是JSONP的简单实现模式,或者说是JSONP的原型:创建一个回调函数,然后在远程服务上调用这个函数并且将JSON 数据形式作为参数传递,完成回调。

将JSON数据填充进回调函数,这就是JSONP的JSON+Padding的含义。

jQuery对JSONP的实现

getJSON

jQuery框架也当然支持JSONP,可以使用$.getJSON(url,[data],[callback])方法

<button onclick="f()">sendAjax</button><script> ???function f(){ ?????????$.getJSON("http://127.0.0.1:8002/SendAjax/?callbacks=?",function(arg){ ???????????alert("hello"+arg) ???????}); ???} ???</script>
8001修改如下,8002不变

结果是一样的,要注意的是在url的后面必须添加一个callback参数,这样getJSON方法才会知道是用JSONP方式去访问服务,callback后面的那个问号是内部自动生成的一个回调函数名。

此外,如果说我们想指定自己的回调函数名,或者说服务上规定了固定回调函数名该怎么办呢?我们可以使用$.ajax方法来实现

$.ajax

<script> ???function f(){ ?????????$.ajax({ ???????????????url:"http://127.0.0.1:7766/SendAjax/", ???????????????dataType:"jsonp", ???????????????jsonp: ‘callbacks‘, ???????????????jsonpCallback:"SayHi" ??????????}); ??????} ???function SayHi(arg){ ???????????????alert(arg); ???????????}</script>
8001修改如下,8002不变
<script> ???function f(){ ???????????$.ajax({ ??????????????url:"http://127.0.0.1:8002/SendAjax/", ??????????????dataType:"jsonp", ???????????//必须有,告诉server,这次访问要的是一个jsonp的结果。 ??????????????jsonp: ‘callbacks‘, ?????????//jQuery帮助随机生成的:callbacks="随机字符创" ??????????????success:function(data){ ??????????????????alert("hi "+data) ?????????????} ????????}); ??????}</script>
回调函数版

jsonp: ‘callbacks‘就是定义一个存放回调函数的键,jsonpCallback是前端定义好的回调函数方法名‘SayHi‘,server端接受callback键对应值后就可以在其中填充数据打包返回了; 

jsonpCallback参数可以不定义,jquery会自动定义一个随机名发过去,那前端就得用回调函数来处理对应数据了。利用jQuery可以很方便的实现JSONP来进行跨域访问。  

注意 JSONP一定是GET请求

<input type="button" onclick="AjaxRequest()" value="跨域Ajax" /><div id="container"></div> ???<script type="text/javascript"> ???????function AjaxRequest() { ???????????$.ajax({ ???????????????url: ‘http://www.jxntv.cn/data/jmd-jxtv2.html?callback=list&_=1454376870403‘, ???????????????type: ‘GET‘, ???????????????dataType: ‘jsonp‘, ???????????????jsonp: ‘callback‘, ???????????????jsonpCallback: ‘list‘, ???????????????success: function (data) { ???????????????????????????????????????$.each(data.data,function(i){ ???????????????????????var item = data.data[i]; ???????????????????????var str = "<p>"+ item.week +"</p>"; ???????????????????????$(‘#container‘).append(str); ???????????????????????$.each(item.list,function(j){ ???????????????????????????var temp = "<a href=‘" + item.list[j].link +"‘>" + item.list[j].name +" </a><br/>"; ???????????????????????????$(‘#container‘).append(temp); ???????????????????????}); ???????????????????????$(‘#container‘).append("<hr/>"); ???????????????????}) ???????????????} ???????????}); ???????}</script>
跨域应用

Jsonp实现跨域访问

原文地址:https://www.cnblogs.com/iyouyue/p/8489711.html

知识推荐

我的编程学习网——分享web前端后端开发技术知识。 垃圾信息处理邮箱 tousu563@163.com 网站地图
icp备案号 闽ICP备2023006418号-8 不良信息举报平台 互联网安全管理备案 Copyright 2023 www.wodecom.cn All Rights Reserved