脱离jsonp,如何跨域读取、提交数据 da宗熊

AJAX跨域请求之JSONP获取JSON数据 Asynchronous JavaScript and XML (Ajax ) 是驱动新一代 Web 站点(流行术语为 Web 2.0 站点)的关键技术。Ajax 允许在不干扰 Web 应用程序的显示和行为的情况下在后台进行数据检索。使用 XMLHttpRequest 函数获取数据,它是一种 API,允许客户端 JavaScript 通过 HTTP 连接到远程服务器。Ajax 也是许多 mashup 的驱动力,它可将来自多个地方的内容集成为单一 Web 应用程序。 不过,由于受到浏览器的限制,该方法不允许跨域通信。如果尝试从不同的域请求数据,会出现安全错误。如果能控制数 据驻留的远程服务器并 立即下载

1、JSONP


刚接触javascript,跨域首先想到的就是JSOP,接而,用到的,就是jQuery的getJSON方法。


JSONP的原理很简单:

         a、浏览器的安全策略,导致了javascript不能垮域名读取数据,就算是父子域也不行。

               但是,跨域读取脚本,是个例外。

         b、动态生成一个scrip标签,把src设为后端借口地址,后端将数据,封装返回成javascript函数。

前端即可在脚本加载完后,执行后端的脚本。


可能说得有点抽象,看个例子吧:

后端代码:

  1. public String getAction(){  
  2.       
  3.     int i = 10;  
  4.     return "jsonp1({value:"+ i +"})";  
  5.   
  6. }  

假如,http://xxx.csdn.com/get.action访问的是上述代码

那前端,只要这么做,就能拿到后端 “i” 的值。

前端代码:

  1. <!-- 预先定义jsonp1函数 -->  
  2. <script>  
  3.     function jsonp1(data){  
  4.        alert(data.value);  
  5.    }  
  6. </script>  
  7. <!-- 等下面脚本加载完成,即会执行jsonp1函数 -->  
  8. <script src="http://xxx.csdn.com/get.action"></script>  

应该不难理解,为什么前端能执行 jsonp1 函数吧?

因为浏览器吧 http://xxx.csdn.com/get.action 返回的字符串,当作了可执行的脚本 --------> jsonp1({value: 1}) ;

SO~



2、脱离JSONP

jsonp读取数据时,非常好用,而且,经过了jQuery的封装,

只要遮样子: $.getJSON("你的连接" + “?callback=?”, params, callback)

jQuery就会默认使用<script>方式,加载数据(当然,前提是你的后端哥们,有对callback参数进行处理啦~~


但是,JSONP不是万能的。

         a、script加载,实际是get请求,对于保密要求高的数据,不适用

         b、虽然说,get请求木有限制提交字符的长度,但是,浏览器的输入栏,是有长度限制的。SO,太大的数据,无法提交

综合来说,JSONP适用于查询数据,或者提交不怎么重要的数据。


那大数据的提交,该何去何从呢?下面,针对兄弟域间数据提交,进行讨论


首先,学习兄弟域数据交互前,要了解几个知识点:

 A、document.domain


  只要将不同域名的两个网页的document.domain设为他们的父域名,两个页面将能通讯
  如:
  a.csdn.com/a.html 里,同一个函数 function funcA,有一个iframe,iframe的地址是 b.csdn.com/b.html
  b.html要访问a.html,b.html里,无论通过top或parent,来访问funcA,浏览器都会提醒:不能跨域读取数据
  但是,只要在a.html 和 b.html里,分别设置了document.domain=csdn.com,在来运行一下,你会发现,浏览器再也不会提醒不能跨域读取啦~
  PS:注意在调用跨域读取函数前,两个页面都已经设置了document.domain了哦~~(血的经验教训啊)。


B、iframe.contentWindow


  b.html读取a.html的内容,只要通过top或parent即可,如在b.html里,调用a.html的函数,可如下调用: parent.funcA();
  但是反过来,a.html要调用b.html的内容呢?
  这时候,就需要contentWindow了。
  大家可以姑且任务,contentWindow 就约等于 window,而实际上,它们两个的属性也是一模一样的。
  不过,contentWindow是递属于iframe的属性,我们可以通过iframe.contentWindow来读取iframe引用的页面的window对象。

 
来重点就来了,了解了上面的知识,大家应该也有个思路了吧?
 
FIRST:给顶级网页,添加document.domain
SECOND:建立一个提交数据用的iframe,也设置相同的document.domain

                (我一般会给iframe的代理页面,引入jQuery)
THIRD:找到iframe的contentWindow,调用相关的方法,如iframe.contentWindow.$.post,给后端发送数据。



很简单吧?其实跨域提交数据,真心不难,捉住两个点,随便玩~。


 

随手找了个两年前的代码,希望帮到各位鞋童:


[javascript] view plain copy 在CODE上查看代码片 派生到我的代码片
  1. /**  
  2.  * create by: da宗熊 
  3.  * create time: 2012-12-25 
  4.  * e-mail:    384858402@qq.com  
  5.  * example:  var cross = MakeCross({自己的配置});  cross.post(url, param, callback); 
  6. **/  
  7. if(!window.MakeCross){  
  8.     function MakeCross(p){  
  9.         var CrossMethod = {  
  10.            CrossUrl:"http://my.test.com/common/cross-domain.jsp",  // 代理页面的地址,我会在代理页面加入jQuery和document.domain  
  11.            Frame:"<iframe id='$0' src='$1' style='visibility:hidden;height:0;width:0;overflow:hidden;border:none;'></iframe>",  
  12.            FrameId :"myCrossFrame_" + MakeLog.frameId++,  
  13.            Domain :"test.com",  
  14.            InitSymbol : "hasInit"  // 标志 iframe 是否加载完毕  
  15.         },  
  16.         that = $.extend(CrossMethod, p);  // 覆盖默认值  
  17.         document.domain = that.Domain;   
  18.           
  19.         // 加载跨域用的 iframe   
  20.         function init(){  
  21.               if(!$("#"+that.FrameId).length>0){  
  22.                   $("body").append(that.Frame.replace("$0",that.FrameId).replace("$1",that.CrossUrl));  
  23.               }  
  24.         }  
  25.           
  26.         // 获取 iframe 的contentWindow  
  27.         function GetCrossWindow(){  
  28.            var win = $("#"+that.FrameId)[0].contentWindow||document.getElementById(that.FrameId).contentWindow;  
  29.            return win;  
  30.         }  
  31.         that.CrossWindow = GetCrossWindow;  
  32.         that.init = function(cb){  
  33.               init();  
  34.               if($("#"+that.FrameId).length>0){  
  35.                   var f = $("#"+that.FrameId);  
  36.                   f.load(function(){  
  37.                      cb?cb():function(){};  
  38.                      $("#"+that.FrameId).attr(that.InitSymbol, "true");  
  39.                      that.init = null;  
  40.                   });  
  41.               }  
  42.         }  
  43.         // 封装jQuery的post和get方法  
  44.         that.post = function(a,b,c,d){  
  45.           return !$("#"+that.FrameId).attr(that.InitSymbol) ? that.init(function(){GetCrossWindow().$.post(a,b,c,d)}) : GetCrossWindow().$.post(a,b,c,d);  
  46.         }  
  47.         that.get = function(a,b,c,d){  
  48.           return !$("#"+that.FrameId).attr(that.InitSymbol) ? that.init(function(){GetCrossWindow().$.get(a,b,c,d)}) : GetCrossWindow().$.get(a,b,c,d);  
  49.         }  
  50.         that.win = GetCrossWindow;  
  51.         return that;  
  52.     };  
  53.     MakeCross.frameId = 1;  
  54. };  
  55. // 多年前写的,优化什么的,就懒得管了 
手把手教你用YOLOv5和OpenCV实现DNF全自动刷图(含自动拾取与Boss战逻辑) 本文详细介绍了如何使用YOLOv5和OpenCV构建DNF全自动刷图系统,包括环境配置、游戏画面采集、目标检测、场景导航及操作控制等核心模块。通过实战案例,帮助开发者掌握游戏自动化技术,实现自动拾取与Boss战逻辑,提升游戏效率。 阅读详情

相关推荐

STM32CubeMX最新版下载安装全攻略(附官网访问问题解决方案)

本文提供了STM32CubeMX最新版的详细下载与安装指南,并针对国内开发者常见的官网访问缓慢、注册验证邮件延迟等问题,给出了实用的解决方案和备选策略。通过清晰的步骤解析,帮助用户快速部署这一强大的STM32图形化配置工具,从而高效启动嵌入式开发项目。

weixin_28256233的博客 196

JSONP解决跨域提交数据(jquery jsonp Ajax)

JSONP是一个非常强大的构建mashp的方法,可是不是一个解决跨域访问问题的万能药。它也有一些缺点 第一也是最重要的:JSONP不提供错误处理。如果动态插入的代码正常运行,你可以得到返回,但是如果失败了,那么什么都不会发生。你无法获得一个404的错误,也不能取消这个请求 另外一个重要的缺点是如果使用了不信任的服务会造成很大的安全隐患。 最近用JSONP做了一个跨域提交问题: js

rrr4578的专栏 1170

DCM、PLL以及DLL等概念及详情

介绍DLL、PLL以及DCM的概念,总结其模块构成、工作原理、相互之间的差异与各自优势。

CLL_caicai的博客 8338

json与jsonp的区别,如何提取跨域请求的jsonp数据

Jsonp 是 json 的一种使用模式,可以让网页从别的域名网站中获取资料,即跨域读取数据。jsonp的基本思想是,网页通过添加一个元素,向服务器请求JSON数据,这种做法不受同源政策限制;服务器收到请求后,将数据放在一个指定名字的回调函数里传回来当通过元素调用数据时,响应内容必须用javascript函数名和圆括号包裹起来。而不是发送这样一段JSON数据,这就是JSONP中P的意义所在。

weixin_47481982的博客 638

SAP开发实战:用FI_DOCUMENT_CHANGE BAPI批量修改FB03凭证抬头和行项目文本(附完整ABAP代码)

本文详细介绍了如何使用SAP的FI_DOCUMENT_CHANGE BAPI批量修改FB03凭证抬头和行项目文本,提供完整的ABAP代码实现方案。通过该BAPI,开发者可以高效完成财务凭证的批量修改,确保数据一致性和审计合规性,显著提升SAP财务模块的运维效率。

weixin_29224589的博客 381

告别裸机:在FreeRTOS上为STM32移植SOEM 1.4.0的完整指南

本文详细介绍了在FreeRTOS环境下为STM32H7系列芯片移植SOEM 1.4.0的完整指南,涵盖环境准备、任务架构设计、OSAL层适配及网络驱动优化等关键步骤。通过EtherCAT主站解决方案的实现,帮助开发者构建稳定可靠的工业自动化系统,提升实时通信性能。

weixin_33582311的博客 363

脱离jsonp,如何跨域读取、提交数据

1、JSONP 刚接触javascript,跨域首先想到的就是JSOP,接而,用到的,就是jQuery的getJSON方法。 JSONP的原理很简单: a、浏览器的安全策略,导致了javascript不能垮域名读取数据,就算是父子域也不行。 但是,跨域读取脚本,是个例外。 b、动态生成一个scrip标签,把src设为后端借口地址,后端将数据,封装返回成javascript

da宗熊专栏 1988

项目介绍 MATLAB实现基于LSTM-XGBoost长短期记忆网络(LSTM)结合极端梯度提升(XGBoost)进行多变量时序预测的详细项目实例(含模型描述及部分示例代码)

本项目基于MATLAB平台,实现LSTM-XGBoost混合模型进行多变量时序预测。通过LSTM网络自动提取时序特征,结合XGBoost强大的回归能力,有效解决多变量时序数据的高维复杂性、长短期依赖捕捉等难题。项目包含完整的数据预处理流程、模型构建与训练方法,以及性能评估指标。提供的GUI界面支持参数调整、训练监控和结果可视化,适用于能源、金融、气象等多领域预测任务。配套代码详细注释,便于理解模型实现细节,为时序预测研究提供实用参考框架。

优质创作者: 人工智能技术领域 对于有一定基础的 MATLAB和Python带具体需求都可以详谈 MATLAB和Python可以提供代码调试服务加油 谢谢 你的鼓励是我前行的动力 谢谢支持 加油 谢谢 102

jsonp获取json数据

这两天做微信端JS接口,当时遇到的第一个问题就是权限验证的参数请求,当你请求access_token等的时候,就会存在跨域问题:然后在网上查了,采用ajax的jsonp进行跨域请求,后来报错了,返回的结果错误。然后认真看了一下文档,发现ajax的jsonp返回的数据是callback(json),卡到这里。最后同时为了安全的考虑,我就将这一部分的权限验证参数在后端做,然后前端请求,这样就避免了跨域...

止于至善 9190

高通平台 Android T 蓝牙技术全解析:A2DP 与 AVRCP 核心代码路径与交互流程

A2DP 接收端 - 连接流程(AVDTP 打开)

专业开发者的博客,一个从事Android WiFi和蓝牙的工程师 290

FOC高频注入量产级C语言实现方案

高频注入技术是无传感器FOC实现零速和低速控制的关键方法,解决了传统反电动势观测器在低速失效的问题。该技术通过向电机注入高频电压信号,利用永磁同步电机凸极性特性,从高频电流响应中解调出转子位置信息。文章详细介绍了三种主流高频注入方法(旋转电压注入、脉振电压注入和脉振电流注入)的原理及实现流程,重点分析了脉振电压注入的信号处理步骤和位置观测器设计。同时提供了完整的C语言实现代码,包括硬件抽象层、核心算法模块(坐标变换、电流环、SVPWM等)和系统集成方案,并给出量产优化建议和安全保护机制。这套方案适用于要求高

汽车软件开发 793

跨域

一,什么是跨域 协议,域名,端口,其中一个不一样,就代表跨域 不是一个源的文档无法操作另一个源的文档,受限如下: 1,Cookie、LocalStorage和IndexDB无法读取 2,DOM无法获得 3,AJAX请求不能发送 可以跨域加载资源的三个标签 1,img-src(图片提供方也可以做下防止盗用链接的处理)应用场景:打点统计兼容性好 2,link- href...

diaojilu3861的博客 241

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

Javascript跨域总结

什么是跨域?我们经常会在页面上使用ajax请求访问其他服务器的数据,此时,客户端会出现跨域问题,跨域问题是由于javascript语言安全限制中的同源策略造成的。简单来说,同源策略是指一段脚本只能读取来自同一来源的窗口和文档的属性,这里的同一来源指的是主机名、协议和端口号的组合。例如: 解决跨域的几种方式:方法:JSONPJSONP(JSON with Padding)是JSON的一种“使用模式”,

zzmxz的博客 729

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

这是目前我见过最好的跨域解决方案!

点击上方蓝色字体,选择“标星公众号”优质文章,第一时间送达关注公众号后台回复pay或mall获取实战项目资料视频作者:campcc来源:https://github.com/campcc/...

公众号-老炮说Java 292

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

可能是最好的跨域解决方案了

点击上方蓝色字体,选择“标星公众号”优质文章,第一时间送达 大家好,我是燕子作者 |campcc来源 |https://github.com/campcc/blog今天我们来聊一个老...

Java 架构师之路 121

前端跨域问题

前端常见问题和技术解决方案 1、同源策略 浏览器同源策略限制请求 同源是指"协议+域名+端口"三者相同,即便两个不同的域名指向同一个ip地址,也非同源。 限制以下行为 Cookie、LocalStorage 和 IndexDB 无法读取 DOM 和 Js对象无法获得 AJAX 请求不能发送 有三个标签是允许跨域加载资源: <img src=XXX> <link href=XXX> <script src=XXX> 2、解决方案 1)通过jsonp跨域 script

weixin_44680009的博客 193

jsonp和cors实现跨域

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_34185512的博客 156

JSONP相关知识小结

一、关于域名 顶级域名 顶级域名分为两类:一是国家级顶级域名(national top-level domainnames,简称nTLDs),200多个国家都按照ISO3166国家代码分配了顶级域名,例如中国是.cn,美国是.us,日本是.jp等;二是国际顶级域名(international top-level domain names,简称iTDs),例如表示工商企业的 .Co

渔舟唱晚1990的专栏 317

jQuery(十一)json、ajax和jsonp(数据相关)

文章目录jsonajax异步和同步局部刷新和无刷新同源策略jQuery里使用ajax json json是JavaScript Object Notation 的首字母缩写,单词的意思是JavaScript对象表示法,这里说的json指的是类似于JavaScript对象的一种数据格式,目前这种数据格式比较流行,逐渐换掉了传统的xml数据模式。 JavaScript自定义对象 //javascript自定义对象 var oMan = {

COOL66BOY的博客 1969

ajax/ jsonp/ jQuery-jsonp/ jsonp公开接口/ 正则/正则表达式

ajax &lt;!DOCTYPE html&gt; &lt;html lang="en"&gt; &lt;head&gt; &lt;meta charset="UTF-8"&gt; &lt;title&gt;ajax&lt;/title&gt; &lt;style type="text/css"&gt; &lt;/

weixin_43152725的博客 287

jQuery Ajax & jsonp

1.Ajax与jsonp (1)ajax技术的目的是让JavaScript发送HTTP请求,与后台通信,获取数据和信息。Ajax技术的原理是实例化xmlhttp对象,使用此对象与后台通信。Ajax通信的过程不会影响后续JavaScript的执行,从而实现异步。 (2)同步和异步同步:等待结果返回在执行异步:不管结果继续执行 (3)局部刷新和无刷新Ajax可以实现局部刷新,也叫无刷新,无刷新指的是整...

weixin_34055787的博客 148

简谈JSONP

1. 同源政策(Same-origin Policy) 浏览器出于安全方面的考虑,只允许与同源下的接口交互。 所谓"同源"指的是"三个相同"。 协议相同:如都是http 或者 https 域名相同:www.example.com/dir 和 www.example.com/dir2/ 端口相同:如都是80端口 目前,如果非同源,共有三种行为受到限制。 Cookie、LocalStora...

weixin_33858249的博客 155

大前端—ajax、json和jsonp

一、json json 是JavaScript Object Notation首字母的缩写,译为JavaScript对象表示法,这里说的json指JavaScript对象的一种数据格式。目前前后端都是用json这种数据格式来传送数据的。 JavaScript自定义对象: var person = { name:"John", age:24, sex:mal...

IrisMiaoer's blog 320

说说JSON和JSONP,也许你会豁然开朗(转)

转自:http://kb.cnblogs.com/page/139725/前言  由于Sencha Touch 2这种开发模式的特性,基本决定了它原生的数据交互行为几乎只能通过AJAX来实现。  当然了,通过调用强大的PhoneGap插件然后打包,你可以实现100%的Socket通讯和本地数据库功能,又或者通过HTML5的WebSocket也可以实现与服务器的通讯和服务端推功能,但这两种方式都有其

683
上一篇: jQuery获取对象时特殊符号的处理方法
下一篇: 前端开发中使用”有限状态机“解决复杂的交互问题
DDPJS
博客等级 码龄17年 0粉丝 0原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值