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 相关文章推荐
又一个小巧的图片预加载类
May 05 Javascript
chrome调试javascript详解
Oct 21 Javascript
基于jQuery实现的无刷新表格分页实例
Feb 17 Javascript
学习掌握JavaScript中this的使用技巧
Aug 29 Javascript
HTML5canvas 绘制一个圆环形的进度表示实例
Dec 16 Javascript
JavaScript Date对象应用实例分享
Oct 30 Javascript
详解vue-cli快速构建vue应用并实现webpack打包
Dec 13 Javascript
微信小程序实现指定显示行数多余文字去掉用省略号代替
Jul 25 Javascript
ES6 Generator函数的应用实例分析
Jun 26 Javascript
js图数据结构处理 迪杰斯特拉算法代码实例
Sep 11 Javascript
Vue.js桌面端自定义滚动条组件之美化滚动条VScroll
Dec 01 Vue.js
详解 TypeScript 枚举类型
Nov 02 Javascript
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
天使彦史上最神还原,性别曝光的那一刻,百万网友恋爱了
2020/03/02 国漫
PHP 选项及相关信息函数库
2006/12/04 PHP
php引用地址改变变量值的问题
2012/03/23 PHP
CI框架在CLI下执行占用内存过大问题的解决方法
2014/06/17 PHP
PHP中file_exists()判断中文文件名无效的解决方法
2014/11/12 PHP
PHP判断数据库中的记录是否存在的方法
2014/11/14 PHP
PHP 魔术变量和魔术函数详解
2015/02/25 PHP
详解Laravel服务容器的绑定与解析
2019/11/05 PHP
浅析js中取绝对值的2种方法
2013/07/09 Javascript
父页面显示遮罩层弹出半透明状态的dialog
2014/03/04 Javascript
浅析JavaScript事件和方法
2015/02/28 Javascript
JavaScript实现页面跳转的几种常用方式
2015/11/28 Javascript
AngularJS模块学习之Anchor Scroll
2016/01/19 Javascript
jQuery prototype冲突的2种解决方法(附demo示例下载)
2016/01/21 Javascript
JavaScript利用正则表达式替换字符串中的内容
2016/12/12 Javascript
详谈jQuery中使用attr(), prop(), val()获取value的异同
2017/04/25 jQuery
javascript实现blob加密视频源地址的方法
2019/08/08 Javascript
jquery实现聊天机器人
2020/02/08 jQuery
原生js实现弹窗消息动画
2020/11/20 Javascript
JavaScript实现京东快递单号查询
2020/11/30 Javascript
详解django.contirb.auth-认证
2018/07/16 Python
Sanic框架配置操作分析
2018/07/17 Python
Python如何将模块打包并发布
2020/08/30 Python
Python爬虫代理池搭建的方法步骤
2020/09/28 Python
100%有机精油,美容油:House of Pure Essence
2018/10/30 全球购物
马来西亚在线药房:RoyalePharma
2019/12/01 全球购物
澳大利亚有机化妆品网上商店:The Well Store
2020/02/20 全球购物
UNIX文件类型
2013/08/29 面试题
社区八一活动方案
2014/02/03 职场文书
学校党委干部个人对照检查材料思想汇报
2014/10/09 职场文书
学籍证明模板
2014/11/21 职场文书
给领导的感谢信范文
2015/01/23 职场文书
2015年重阳节主持词
2015/07/04 职场文书
运动会广播稿50字
2015/08/19 职场文书
python 遍历磁盘目录的三种方法
2021/04/02 Python
一篇文章弄懂MySQL查询语句的执行过程
2021/05/07 MySQL