JavaScript 跨域之POST实现方法


Posted in Javascript onMay 07, 2018

javascript 跨域是一个很常见的问题,其中 jsonp 是一个最常用的手段,但是 jsonp 只支持 get,不支持 post,所以如果想通过 jsonp 来 post 一些数据,就头大了。

此处通过在一个 iframe 中生成 form 表单的形式来实现 post,并通过 postMessage 来向调用者返回值。

第一步,我们先实现一个接受 jsonp 的后端代码,至于用什么语言实现,各位自已决定。

c#代码是:

protected void Page_Load(object sender, EventArgs e)
    {
      StringBuilder sbRet = new StringBuilder();
      sbRet.Append("<script>");
      sbRet.Append(Request["jsoncallback"]);
      sbRet.Append("({");

      foreach (string k in Request.Form) {
        if (k == "jsoncallback") continue;
        sbRet.Append("'"+k+"':'"+Request.Form[k]+"'");
      }

      
      sbRet.Append("});");
      sbRet.Append("</script>");

      Response.Write(sbRet.ToString());
      Response.End();
    }

比如说你想返回给我的是    { userName:'user1', password:'pass1' }  , 当我调用 http://localhost/test?jsoncallback=callme 的时候

你实际返回 <script>callme({ userName:'user1', password:'pass1' })</script> 即可。

第二步,本地文件夹内构建post测试页面,如 d:\test.html

<form action="http://localhost/test" method="post">
<input type="text" name="userName" value="user1" />

<input type="text" name="password" value="pass1" />
  <input type="text" name="jsoncallback" value="callme" />
  <input type="submit" value="提交" />
</form>

第三步,浏览一下并点击提交,看看返回的如果是 <script>callme({ userName:'user1', password:'pass1' })</script>则说明后端程序没有问题了。

第四步,我们写段通用的代码来实现上面的 html.

<!doctype html>
<html>
  <head>
   <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    <title>测试一哈</title>
  </head>  
  <body>   
  <script>
  //源码 开始
   function postJSONP(url, data, callback) {
    var template = '<form action="{{url}}" method="post" id="form1">';   
    for (var k in data) {
     template = template
       + '  <input type="text" name="'+k+'" value="'+data[k]+'" />'
    }
      template = template 
      + '<input type="text" name="jsoncallback" value="function callback(data) { parent.postMessage(data, \'*\'); } callback" />'
      + '</form>'
      + '<'+'script>'
      + 'document.getElementById("form1").submit();'
      + '</'+'script>';      
   template = template.replace("{{url}}", url);      
   var div = document.createElement("div");
   div.style.display = 'none';  
   div.innerHTML = '<iframe src=""></iframe>';
   document.body.appendChild(div);   
   var ifrm = div.children[0];
   var cwin = ifrm.contentWindow;
   cwin.document.write(template);   
   window.onmessage = function(e) {
   if (callback) callback(e.data);
   }
   }
   //源码 结束  
  //使用测试
   window.onload = function() {
   postJSONP('http://localhost:59898/WebForm1.aspx', { userName: '张静', password: '就不告诉你' }, function(data) {
    console.log(11, data);
   });

   postJSONP('http://localhost:59898/WebForm1.aspx', { 仓库: '1号大仓', 面积: '2万平米' }, function(data) {
    console.log(22, data);
   });
  }
 </script>
  </body>
</html>

第五步、安全问题、

window.onmessage = function(e) {
  //可通过 e 来判断来源,并做一些安全方面的处理,此处读者自己去研究吧,可以加个 console.log(e) 看看 e 有哪些内容。
  if (callback) callback(e.data);
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
『jQuery』.html(),.text()和.val()的概述及使用
Apr 22 Javascript
js setTimeout 参数传递使用介绍
Aug 13 Javascript
js使下拉列表框可编辑不止是选择
Dec 12 Javascript
javascript瀑布流布局实现方法详解
Feb 17 Javascript
JS中动态创建元素的三种方法总结(推荐)
Oct 20 Javascript
浅谈angularjs module返回对象的坑(推荐)
Oct 21 Javascript
jQuery Masonry瀑布流插件使用方法详解
Jan 18 Javascript
vue源码学习之Object.defineProperty对象属性监听
May 30 Javascript
JavaScript实现数组全排列、去重及求最大值算法示例
Jul 30 Javascript
js实现多图和单图上传显示
Dec 18 Javascript
详解Vue的组件中data选项为什么必须是函数
Aug 17 Javascript
jQuery实现手风琴特效
Jan 11 jQuery
ES6关于Promise的用法详解
May 07 #Javascript
React Form组件的实现封装杂谈
May 07 #Javascript
vue如何将v-for中的表格导出来
May 07 #Javascript
浅谈Vue 数据响应式原理
May 07 #Javascript
浅谈Vue响应式(数组变异方法)
May 07 #Javascript
在HTML文档中嵌入JavaScript的四种方法
May 07 #Javascript
详解JavaScript的BUG和错误
May 07 #Javascript
You might like
2019年漫画销量排行榜:鬼灭登顶 海贼单卷制霸 尾田盛赞鬼灭
2020/03/08 日漫
融入意大利的咖啡文化
2021/03/03 咖啡文化
PHP与MySQL开发中页面出现乱码的一种解决方法
2007/07/29 PHP
对于Laravel 5.5核心架构的深入理解
2018/02/22 PHP
WebGame《逆转裁判》完整版 代码下载(1月24日更新)
2007/01/29 Javascript
解决jquery的.animate()函数在IE6下的问题
2010/12/03 Javascript
js iframe跨域访问(同主域/非同主域)分别深入介绍
2013/01/24 Javascript
Jquery实现鼠标移上弹出提示框、移出消失思路及代码
2013/05/19 Javascript
jquery中插件实现自动添加用户的具体代码
2013/11/15 Javascript
Javascript中arguments用法实例分析
2015/06/13 Javascript
JS实现跟随鼠标的链接文字提示框效果
2015/08/06 Javascript
jQuery手动点击实现图片轮播特效
2020/04/20 Javascript
AngularJS页面访问时出现页面闪烁问题的解决
2016/03/06 Javascript
js实现当鼠标移到表格上时显示这一格全部内容的代码
2016/06/12 Javascript
使用json来定义函数,在里面可以定义多个函数的实现方法
2016/10/28 Javascript
JS实现元素上下左右移动效果
2017/10/18 Javascript
五步轻松实现JavaScript HTML时钟效果
2020/03/25 Javascript
node 命令方式启动修改端口的方法
2018/05/12 Javascript
对vuex中store和$store的区别说明
2020/07/24 Javascript
vue + el-form 实现的多层循环表单验证
2020/11/25 Vue.js
[03:06]2018年度CS GO最具人气解说-完美盛典
2018/12/16 DOTA
python简单图片操作:打开\显示\保存图像方法介绍
2017/11/23 Python
python调用百度REST API实现语音识别
2018/08/30 Python
解决新版Pycharm中Matplotlib图像不在弹出独立的显示窗口问题
2019/01/15 Python
softmax及python实现过程解析
2019/09/30 Python
Python 基于wxpy库实现微信添加好友功能(简洁)
2019/11/29 Python
基于python及pytorch中乘法的使用详解
2019/12/27 Python
Python爬虫实例——scrapy框架爬取拉勾网招聘信息
2020/07/14 Python
python操作redis数据库的三种方法
2020/09/10 Python
DERMAdoctor官网:美国著名皮肤护理品牌
2019/07/06 全球购物
应届大学毕业生找工作的求职信范文
2013/11/29 职场文书
给领导的检讨书
2014/02/16 职场文书
2014年政协委员工作总结
2014/12/01 职场文书
2016年大学校运会广播稿件
2015/12/21 职场文书
Python尝试实现蒙特卡罗模拟期权定价
2022/04/21 Python
pycharm无法安装cv2模块问题
2022/05/20 Python