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 相关文章推荐
js 使用form表单select类实现级联菜单效果
Dec 19 Javascript
各种常用的JS函数整理
Oct 25 Javascript
jquery创建表格(自动增加表格)代码分享
Dec 25 Javascript
jquery 按键盘上的enter事件
May 11 Javascript
Javascript实现Array和String互转换的方法
Dec 21 Javascript
JavaScript实现图片自动加载的瀑布流效果
Apr 11 Javascript
基于BootStrap Metronic开发框架经验小结【九】实现Web页面内容的打印预览和保存操作
May 12 Javascript
jQuery实现鼠标滚动图片延迟加载效果附源码下载
Jun 28 Javascript
js与jquery正则验证电子邮箱、手机号、邮政编码的方法
Jul 04 Javascript
Vue v2.5 调整和更新不完全问题
Oct 24 Javascript
详解用场景去理解函数柯里化(入门篇)
Apr 11 Javascript
vue实现计步器功能
Nov 01 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
FireFox浏览器使用Javascript上传大文件
2013/10/30 PHP
php实现图片上传并利用ImageMagick生成缩略图
2016/03/14 PHP
Alliance vs Liquid BO3 第三场2.13
2021/03/10 DOTA
使用javascript过滤html的字符串(注释标记法)
2013/07/08 Javascript
使用nodejs、Python写的一个简易HTTP静态文件服务器
2014/07/18 NodeJs
js中使用replace方法完成某个字符的转换
2014/08/20 Javascript
require.js深入了解 require.js特性介绍
2014/09/04 Javascript
JavaScript判断前缀、后缀是否是空格的方法
2015/04/15 Javascript
jQuery向webApi提交post json数据
2017/01/16 Javascript
canvas实现图像放大镜
2017/02/06 Javascript
Vue.js数据绑定之data属性
2017/07/07 Javascript
jQuery Position方法使用和兼容性
2017/08/23 jQuery
用Webpack构建Vue项目的实践
2017/11/07 Javascript
JS动态显示倒计时效果
2019/12/12 Javascript
vue实现输入一位数字转汉字功能
2019/12/13 Javascript
js实现详情页放大镜效果
2020/10/28 Javascript
python简单猜数游戏实例
2015/07/09 Python
python开发之文件操作用法实例
2015/11/13 Python
python黑魔法之参数传递
2016/02/12 Python
python用模块zlib压缩与解压字符串和文件的方法
2016/12/16 Python
解决pycharm界面不能显示中文的问题
2018/05/23 Python
centos6.8安装python3.7无法import _ssl的解决方法
2018/09/17 Python
基于Python实现用户管理系统
2019/02/26 Python
Django 中间键和上下文处理器的使用
2019/03/17 Python
对python3 Serial 串口助手的接收读取数据方法详解
2019/06/12 Python
如何通过Python实现标签云算法
2019/07/02 Python
Python Threading 线程/互斥锁/死锁/GIL锁
2019/07/21 Python
HTML5 video标签(播放器)学习笔记(二):播放控制
2015/04/24 HTML / CSS
介绍下Lucene建立索引的过程
2016/03/02 面试题
大学生暑期实践感言
2014/02/26 职场文书
洗车工岗位职责
2014/03/15 职场文书
高中毕业生登记表自我鉴定范文
2014/03/18 职场文书
学习党代会心得体会
2014/09/05 职场文书
高一军训感想
2015/08/07 职场文书
react合成事件与原生事件的相关理解
2021/05/13 Javascript
Java 超详细讲解ThreadLocal类的使用
2022/04/07 Java/Android