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 操作Word和Excel的实现代码
Oct 26 Javascript
js 多浏览器分别判断代码
Apr 01 Javascript
JQuery制作的放大效果的popup对话框(未添加任何jquery plugin)分享
Apr 28 Javascript
js数组操作常用方法
May 08 Javascript
js使用DOM设置单选按钮、复选框及下拉菜单的方法
Jan 20 Javascript
JavaScript对数组进行随机重排的方法
Jul 22 Javascript
跟我学习javascript解决异步编程异常方案
Nov 23 Javascript
JavaScript使ifram跨域相互访问及与PHP通信的实例
Mar 03 Javascript
解析如何利用iframe标签以及js制作时钟
Dec 08 Javascript
Bootstrap modal 多弹窗之叠加引起的滚动条遮罩阴影问题
Feb 27 Javascript
jQuery实现动态显示select下拉列表数据的方法
Feb 05 jQuery
Javascript中prototype与__proto__的关系详解
Mar 11 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+MYSQL 出现乱码的解决方法
2008/08/08 PHP
PHP中array_merge和array相加的区别分析
2013/06/17 PHP
PHP 二维数组根据某个字段排序的具体实现
2014/06/03 PHP
PHP5.3安装Zend Guard Loader图文教程
2014/09/29 PHP
ThinkPHP框架获取最后一次执行SQL语句及变量调试简单操作示例
2018/06/13 PHP
PHP创建XML接口示例
2019/07/04 PHP
js验证表单大全
2006/11/25 Javascript
javascript上传图片前预览图片兼容大多数浏览器
2013/10/25 Javascript
js判断文本框剩余可输入字数的方法
2015/02/04 Javascript
微信小程序 删除项目工程实现步骤
2016/11/10 Javascript
微信小程序 高德地图SDK详解及简单实例(源码下载)
2017/01/11 Javascript
使用jQuery的load方法设计动态加载及解决被加载页面js失效问题
2017/03/01 Javascript
分享一个精简的vue.js 图片lazyload插件实例
2017/03/13 Javascript
简单快速的实现js计算器功能
2017/08/17 Javascript
React Native时间转换格式工具类分享
2017/10/24 Javascript
JavaScript中call和apply方法的区别实例分析
2018/08/03 Javascript
vue构建动态表单的方法示例
2018/09/22 Javascript
Vue实现背景更换颜色操作
2020/07/17 Javascript
js利用iframe实现选项卡效果
2020/08/09 Javascript
Python中的错误和异常处理简单操作示例【try-except用法】
2017/07/25 Python
python基础教程项目二之画幅好画
2018/04/02 Python
Python中判断输入是否为数字的实现代码
2018/05/26 Python
python对矩阵进行转置的2种处理方法
2019/07/17 Python
Python将列表中的元素转化为数字并排序的示例
2019/12/25 Python
tensorflow estimator 使用hook实现finetune方式
2020/01/21 Python
Python urllib库如何添加headers过程解析
2020/10/05 Python
HTML5之HTML元素扩展(下)—增强的Form表单元素值得关注
2013/01/31 HTML / CSS
HTML5之语义标签介绍
2016/07/07 HTML / CSS
英语系本科生求职信范文
2013/12/18 职场文书
文化活动实施方案
2014/03/28 职场文书
分居协议书范本
2014/11/03 职场文书
MySQL学习总结-基础架构概述
2021/04/05 MySQL
Python Socket编程详解
2021/04/25 Python
windows下快速安装nginx并配置开机自启动的方法
2021/05/11 Servers
Mysql数据库值的添加、修改、删除及清空操作实例
2021/06/20 MySQL
详解Python类和对象内容
2021/06/22 Python