JSONP实现Ajax跨域

同源策略,它是由Netscape提出的一个著名的安全策略

现在所有支持JavaScript 的浏览器都会使用这个策略。

所谓同源是指,域名,协议,端口相同。

当一个浏览器的两个tab页中分别打开来 百度和谷歌的页面

当浏览器的百度tab页执行一个脚本的时候会检查这个脚本是属于哪个页面的,

即检查是否同源,只有和百度同源的脚本才会被执行。

如果非同源,那么在请求数据时,浏览器会在控制台中报一个异常,提示拒绝访问。

而标签带有src的可以突破同源策略。例如<img> <sccript> <Iframe>标签。

JSONP两大机制是:

  • 1:浏览器有同源策略,采用script即可将数据发送过去,但拿回数据不正确
  • 2:dataType=‘jsonp‘,是的拿回数据正确

例子(1):

<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <div id="content"></div>
    <input type="button" value="发送1" onclick="submitJsonp1();">
    <input type="button" value="发送2" onclick="submitJsonp2();">
    <input type="button" value="发送3" onclick="submitJsonp3();">
    <script src="/static/jquery-3.2.0.js"></script>
    <script>
        function submitJsonp1(){
            $.ajax({
                url:‘/ajax3.html‘,
                type:‘GET‘,
                data:{nid:2},
                success:function (arg) {
                    $(‘#content‘).html(arg);
                }
            })
        }

#采用 submitJsonp1,由于我的url是同源,则发送数据接收数据都可正确

结果:

例子(2):若为不同源情况,新创建sunkai project 将端口改为9000

 <input type="button" value="发送2" onclick="submitJsonp2();">
    <input type="button" value="发送3" onclick="submitJsonp3();">
    <script src="/static/jquery-3.2.0.js"></script>
    <script>
        function submitJsonp1(){
            $.ajax({
                url:‘/ajax3.html‘,
                type:‘GET‘,
                data:{nid:2},
                success:function (arg) {
                    $(‘#content‘).html(arg);
                }
            })
        }
        function submitJsonp2() {
            var tag = document.createElement(‘script‘);
            tag.src = ‘http://127.0.0.1:9000/xiaokai.html‘;
            document.head.appendChild(tag);
            document.head.removeChild(tag);

        }
        function func(arg) {
           $(‘#content‘).html(arg);
        }
#采用 submitJsonp2,这里的关键就是func()联系了两个不同源网页

结果 (发送二):

例子三(和例子二做对比):

 function submitJsonp3() {
            $.ajax({
                url:‘http://127.0.0.1:9000/xiaokai.html‘,
                type:‘GET‘,
                dataType:‘jsonp‘
            })
        }
        function func(arg) {
           $(‘#content‘).html(arg);
        }这里的重点就是dataType:‘jsonp‘,虽然都是Ajax发送,但是jsonp内部封装一种方式,使之简单。

结果:

结论:JSONP是一种方式,随机生成script块,添加到<head>里面再移除掉,==》可以和其他网站交互。

时间: 2024-08-28 17:34:01

JSONP实现Ajax跨域的相关文章

使用jsonp实现ajax跨域请求

Jsonp(JSON with Padding)是资料格式 json 的一种“使用模式”,可以让网页从别的网域获取资料. 由于同源策略,一般来说位于 server1.example.com 的网页无法与不是 server1.example.com的服务器沟通,而 HTML 的<script> 元素是一个例外.利用 <script> 元素的这个开放策略,网页可以得到从其他来源动态产生的 JSON 资料,而这种使用模式就是所谓的 JSONP.用 JSONP 抓到的资料并不是 JSON,

jQuery中利用JSONP解决AJAX跨域问题

写在前面 跨域的解决方案有多种,其中最常见的是使用同一服务器下的代理来获取远端数据,再通过ajax进行读取,而在这期间经过了两次请求过程,使得获取数据的效率大大降低,这篇文章蓝飞就为大家介绍一下解决跨域问题的一种比较通用的方案——JSONP. 什么是跨域? 简单的来说,出于安全方面的考虑,页面中的JavaScript无法访问其他服务器上的数据,即“同源策略”.而跨域就是通过某些手段来绕过同源策略限制,实现不同服务器之间通信的效果. 具体策略限制情况可看下表: URL 说明 允许通信 http:/

JFinal,Jsonp,Jquery,Ajax,跨域

JFinal的Controller返回的时候如下: 这里的content就是我的Json字符串 renderJson("innerSignCallBack(" + content+")");//跨域的请求,jsonp 页面的Ajax如下: var url = 'http://xxx.com/getJson'; $.ajax({ type : "get", //必须get,不填也行 url : url, //这里的url不需要在最后加上&i

Jsonp实现Ajax跨域Demo

JSONP 1.一个众所周知的问题,Ajax直接请求普通文件存在跨域无权限访问的问题,甭管你是静态页面.动态网页.web服务.WCF,只要是跨域请求,一律不准: 2.不过我们又发现,Web页面上调用js文件时则不受是否跨域的影响(不仅如此,我们还发现凡是拥有"src"这个属性的标签都拥有跨域的能力,比如script.img.iframe): 3.于是可以判断,当前阶段如果想通过纯web端(ActiveX控件.服务端代理.属于未来的HTML5之Websocket等方式不算)跨域访问数据就

说说JSON和JSONP,浅析JSONP解决AJAX跨域问题

说到AJAX就会不可避免的面临两个问题,第一个是AJAX以何种格式来交换数据?第二个是跨域的需求如何解决?这两个问题目前都有不同的解决方案,比如数据可以用自定义字符串或者用XML来描述,跨域可以通过服务器端代理来解决. 但到目前为止最被推崇或者说首选的方案还是用JSON来传数据,靠JSONP来跨域.而这就是本文将要讲述的内容. JSON和JSONP虽然只有一个字母的差别,但其实他们根本不是一回事儿:JSON是一种数据交换格式,而JSONP是一种依靠开发人员的聪明才智创造出的一种非官方跨域数据交互

【转】Php+ajax+jsonp解决ajax跨域问题

首先:jsonp是json用来跨域的一个东西. 原理是通过script标签的跨域特性来绕过同源策略. 发送端: $.ajax({ type : "post", url : "ajax.php", dataType : "jsonp", jsonp: "callback",//传递给请求处理程序或页面的,用以获得jsonp回调函数名的参数名(默认为:callback) jsonpCallback:"jsonpcallb

JSONP解决ajax跨域问题

在A域名下,用ajax请求B域名下的请求,会报类似这样的错误:No 'Access-Control-Allow-Origin' header is present on the requested resource. 在响应头中加入一个属性:response.setHeader("Access-Control-Allow-Origin", "*"); 可以解决,但都说有安全问题... 那么就用jsonp的方式解决. 下面是转的文章: JSONP是如何工作的? 我对这

利用JQuery jsonp实现Ajax跨域请求 .Net 的*.handler 和 WebService,返回json数据

1:跨域请求handler一般处理程序 using System; using System.Collections.Generic; using System.Web; using System.Web.Services; namespace CrossDomain { /// <summary> /// $codebehindclassname$ 的摘要说明 /// </summary> [WebService(Namespace = "http://tempuri.

Php+ajax+jsonp解决ajax跨域问题

  <script> $(document).ready(function(){ $("#search").click(function(){ $.ajax({ type: 'GET', url: 'http://localhost/app.php',//请求的地址,这里是php dataType: 'jsonp', jsonp:'JsonCallback',//回调函数的名称 async:true, success: function(result){ }, error: