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 相关文章推荐
显示、隐藏密码
Jul 01 Javascript
JavaScript语法着色引擎(demo及打包文件下载)
Jun 13 Javascript
常用简易JavaScript函数
Apr 09 Javascript
JavaScript 嵌套函数指向this对象错误的解决方法
Mar 15 Javascript
js RuntimeObject() 获取ie里面自定义函数或者属性的集合
Nov 23 Javascript
ie支持function.bind()方法实现代码
Dec 27 Javascript
jquery ajax应用中iframe自适应高度问题解决方法
Apr 12 Javascript
详解JavaScript中setSeconds()方法的使用
Jun 11 Javascript
JavaScript中的函数(二)
Dec 23 Javascript
jQuery中使用animate自定义动画的方法
May 29 Javascript
node.js学习之base64编码解码
Oct 21 Javascript
微信小程序云开发 生成带参小程序码流程
May 18 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
咖啡与牛奶
2021/03/03 冲泡冲煮
使用 MySQL Date/Time 类型
2008/03/26 PHP
php XMLWriter类的简单示例代码(RSS输出)
2011/09/30 PHP
php随机显示图片的简单示例
2014/02/15 PHP
ThinkPHP实现动态包含文件的方法
2014/11/29 PHP
php生成短网址/短链接原理和用法实例分析
2020/05/29 PHP
文字不间断滚动(上下左右)实例代码
2013/04/21 Javascript
JavaScript子类用Object.getPrototypeOf去调用父类方法解析
2013/12/05 Javascript
Jquery焦点与失去焦点示例应用
2014/06/10 Javascript
JavaScript 开发工具webstrom使用指南
2014/12/09 Javascript
javascript学习指南之回调问题
2016/04/23 Javascript
JavaScript组合模式学习要点
2016/08/26 Javascript
快速解决js中window.location.href不工作的问题
2016/11/02 Javascript
vue.js将unix时间戳转换为自定义时间格式
2017/01/03 Javascript
Javascript面试经典套路reduce函数查重
2017/03/23 Javascript
详解如何在React组件“外”使用父组件的Props
2018/01/12 Javascript
微信小程序和百度的语音识别接口详解
2019/05/06 Javascript
Fetch超时设置与终止请求详解
2019/05/18 Javascript
vue实现多组关键词对应高亮显示功能
2019/07/25 Javascript
Django的session中对于用户验证的支持
2015/07/23 Python
Python实现感知器模型、两层神经网络
2017/12/19 Python
Python 调用PIL库失败的解决方法
2019/01/08 Python
python 操作hive pyhs2方式
2019/12/21 Python
python 操作mysql数据中fetchone()和fetchall()方式
2020/05/15 Python
python实现按键精灵找色点击功能教程,使用pywin32和Pillow库
2020/06/04 Python
用python写爬虫简单吗
2020/07/28 Python
struct与class的区别
2014/02/03 面试题
医务人员竞聘职务自我评价分享
2013/11/08 职场文书
小松树教学反思
2014/02/11 职场文书
大学生学习2014年全国两会心得体会
2014/03/12 职场文书
2014年党务公开方案
2014/05/08 职场文书
2014幼儿园小班工作总结
2014/11/10 职场文书
统计员岗位职责范本
2015/04/14 职场文书
赢在中国观后感
2015/06/02 职场文书
感恩教育主题班会
2015/08/12 职场文书
Java中的随机数Random
2022/03/17 Java/Android