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 相关文章推荐
JavaScript Archive Network 集合
May 12 Javascript
关于Jqzoom的使用心得 jquery放大镜效果插件
Apr 12 Javascript
基于JQuery的简单实现折叠菜单代码
Sep 15 Javascript
JQuery一种取同级值的方式(比如你在GridView中)
Mar 15 Javascript
JavaScript中的方法重载实例
Mar 16 Javascript
javascript实现数组内值索引随机化及创建随机数组的方法
Aug 10 Javascript
简单实现IONIC购物车功能
Jan 10 Javascript
canvas绘制爱心的几种方法总结(推荐)
Oct 31 Javascript
Angular自定义组件实现数据双向数据绑定的实例
Dec 11 Javascript
浅谈Vue 性能优化之深挖数组
Dec 11 Javascript
Vue中常用rules校验规则(实例代码)
Nov 14 Javascript
vue+vant实现商品列表批量倒计时功能
Jan 13 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
谈谈新手如何学习PHP
2006/12/14 PHP
PHP 数组基础知识小结
2010/08/20 PHP
Chrome Form多次提交表单问题的解决方法
2011/05/09 Javascript
jquery入门—数据删除与隔行变色以及图片预览
2013/01/07 Javascript
jquery load事件(callback/data)使用方法及注意事项
2013/02/06 Javascript
用javascript添加控件自定义属性解析
2013/11/25 Javascript
调试代码导致IE出错的避免方法
2014/04/04 Javascript
解决js下referer兼容各大浏览器的方法
2014/11/03 Javascript
JavaScript给url网址进行encode编码的方法
2015/03/18 Javascript
在Node.js应用中读写Redis数据库的简单方法
2015/06/30 Javascript
基于jQuery.validate及Bootstrap的tooltip开发气泡样式的表单校验组件思路详解
2016/07/18 Javascript
关于Iframe父页面与子页面之间的相互调用
2016/11/22 Javascript
JS DOMReady事件的六种实现方法总结
2016/11/23 Javascript
微信小程序 实战实例开发流程详细介绍
2017/01/05 Javascript
vue.js vue-router如何实现无效路由(404)的友好提示
2017/12/20 Javascript
node.js读取Excel数据(下载图片)的方法示例
2018/08/02 Javascript
浅谈JavaScript 代码简洁之道
2019/01/09 Javascript
Webpack中loader打包各种文件的方法实例
2019/09/03 Javascript
微信小程序实现单个卡片左滑显示按钮并防止上下滑动干扰功能
2019/12/06 Javascript
在Python的Django框架上部署ORM库的教程
2015/04/20 Python
numpy排序与集合运算用法示例
2017/12/15 Python
50行Python代码实现人脸检测功能
2018/01/23 Python
python3.6使用pickle序列化class的方法
2018/10/22 Python
python获取Pandas列名的几种方法
2019/08/07 Python
Pytorch evaluation每次运行结果不同的解决
2020/01/02 Python
pytorch dataloader 取batch_size时候出现bug的解决方式
2020/02/20 Python
Python使用shutil模块实现文件拷贝
2020/07/31 Python
纯css3实现思维导图样式示例
2018/11/01 HTML / CSS
英国健身超市:Fitness Superstore
2019/06/17 全球购物
写自荐信三大法宝
2014/01/24 职场文书
大学生军训感想
2014/02/16 职场文书
团队拓展活动方案
2014/08/28 职场文书
大学辅导员述职报告
2015/01/10 职场文书
新闻稿件写作技巧
2015/07/18 职场文书
python_tkinter弹出对话框创建
2022/03/20 Python
详解Nginx的超时keeplive_timeout配置步骤
2022/05/25 Servers